登录
首页 >  Golang >  Go问答

如何正确循环 golang 中的两个嵌套 json 结构

来源:stackoverflow

时间:2024-04-10 20:48:34 474浏览 收藏

从现在开始,我们要努力学习啦!今天我给大家带来《如何正确循环 golang 中的两个嵌套 json 结构》,感兴趣的朋友请继续看下去吧!下文中的内容我们主要会涉及到等等知识点,如果在阅读本文过程中有遇到不清楚的地方,欢迎留言呀!我们一起讨论,一起学习!

问题内容

我是 go 新手。我有 2 个相同的 json 嵌套结构,每个结构都填充了 2 个 api 调用的输出。一次调用可获取 cpu 和其他内存指标。我可以单独解组它们中的每一个,并打印出项目名称以及 cpu 和内存的值,尽管是在 2 个单独的代码块中。我遇到的问题是我想在同一行的项目名称旁边打印出 cpu 和内存指标。

这是我用来按项目打印 cpu 指标的代码。它创建了一个漂亮的 csv 格式的输出:

// cpu metrics
// loop through the data for the month, project, cpu requests, and cpu usage
   fmt.println("month, project, cpu request(core hours), cpu usage(core hours)\n")
   for _, value_cpu := range rh_values_cpu.data {
       for _, val_cpu := range value_cpu.projects {
        str := val_cpu.project
        s := strings.contains(str, "openshift")
         if s == true  {
            continue
        }
           fmt.printf("%s, %s, ", value_cpu.date, val_cpu.project)
           for _, v_cpu := range val_cpu.values {
           fmt.printf("%.1f, %.1f\n", v_cpu.request.value, v_cpu.usage.value)
         }
       }
    }

我有类似的内存指标代码,也可以正常工作。

这是我用来循环两个 json 结构的代码。我怀疑我没有正确使用嵌套循环或者需要以不同的方式解决问题。

// cpu & memory metrics
// loop through the data for the month, project, cpu requests, cpu usage, memory requests, and memory usage
   fmt.println("month, project, cpu request(core hours), cpu usage(core hours) memory request(mbytes), memory usage(mbytes)\n")
   for _, value_cpu := range rh_values_cpu.data {
    for _, value_mem := range rh_values_mem.data {
      for _, val_cpu := range value_cpu.projects {
        for _, val_mem := range value_mem.projects {
         str := val_cpu.project
         s := strings.contains(str, "openshift")
          if s == true  {
            continue
        }
           fmt.printf("%s, %s, ", value_cpu.date, val_cpu.project)
           for _, v_cpu := range val_cpu.values {
              fmt.printf("%.1f, %.1f ", v_cpu.request.value, v_cpu.usage.value)
                for _,v_mem := range val_mem.values {
                  fmt.printf("%.1f, %.1f\n", v_mem.request.value, v_mem.usage.value)
       }
    }
  }
}
}
}

这是 json 结构之一:

type rh_output_mem struct {
    meta struct {
        count    int    `json:"count"`
        others   int    `json:"others"`
        currency string `json:"currency"`
        filter   struct {
            resolution     string `json:"resolution"`
            timescopevalue string `json:"time_scope_value"`
            timescopeunits string `json:"time_scope_units"`
            limit          int    `json:"limit"`
            offset         int    `json:"offset"`
        } `json:"filter"`
        groupby struct {
            project []string `json:"project"`
        } `json:"group_by"`
        orderby struct {
        } `json:"order_by"`
        exclude struct {
        } `json:"exclude"`
        total struct {
            usage struct {
                value float64 `json:"value"`
                units string  `json:"units"`
            } `json:"usage"`
            request struct {
                value float64 `json:"value"`
                units string  `json:"units"`
            } `json:"request"`
            limit struct {
                value float64 `json:"value"`
                units string  `json:"units"`
            } `json:"limit"`
            capacity struct {
                value float64 `json:"value"`
                units string  `json:"units"`
            } `json:"capacity"`
            infrastructure struct {
                raw struct {
                    value float64 `json:"value"`
                    units string  `json:"units"`
                } `json:"raw"`
                markup struct {
                    value float64 `json:"value"`
                    units string  `json:"units"`
                } `json:"markup"`
                usage struct {
                    value float64 `json:"value"`
                    units string  `json:"units"`
                } `json:"usage"`
                distributed struct {
                    value float64 `json:"value"`
                    units string  `json:"units"`
                } `json:"distributed"`
                total struct {
                    value float64 `json:"value"`
                    units string  `json:"units"`
                } `json:"total"`
            } `json:"infrastructure"`
            supplementary struct {
                raw struct {
                    value float64 `json:"value"`
                    units string  `json:"units"`
                } `json:"raw"`
                markup struct {
                    value float64 `json:"value"`
                    units string  `json:"units"`
                } `json:"markup"`
                usage struct {
                    value float64 `json:"value"`
                    units string  `json:"units"`
                } `json:"usage"`
                distributed struct {
                    value float64 `json:"value"`
                    units string  `json:"units"`
                } `json:"distributed"`
                total struct {
                    value float64 `json:"value"`
                    units string  `json:"units"`
                } `json:"total"`
            } `json:"supplementary"`
            cost struct {
                raw struct {
                    value float64 `json:"value"`
                    units string  `json:"units"`
                } `json:"raw"`
                markup struct {
                    value float64 `json:"value"`
                    units string  `json:"units"`
                } `json:"markup"`
                usage struct {
                    value float64 `json:"value"`
                    units string  `json:"units"`
                } `json:"usage"`
                distributed struct {
                    value float64 `json:"value"`
                    units string  `json:"units"`
                } `json:"distributed"`
                total struct {
                    value float64 `json:"value"`
                    units string  `json:"units"`
                } `json:"total"`
            } `json:"cost"`
        } `json:"total"`
    } `json:"meta"`
    links struct {
        first    string      `json:"first"`
        next     string      `json:"next"`
        previous interface{} `json:"previous"`
        last     string      `json:"last"`
    } `json:"links"`
    data []struct {
        date     string `json:"date"`
        projects []struct {
            project string `json:"project"`
            values  []struct {
                date    string `json:"date"`
                project string `json:"project"`
                usage   struct {
                    value float64 `json:"value"`
                    units string  `json:"units"`
                } `json:"usage"`
                request struct {
                    value float64 `json:"value"`
                    units string  `json:"units"`
                } `json:"request"`
                limit struct {
                    value float64 `json:"value"`
                    units string  `json:"units"`
                } `json:"limit"`
                capacity struct {
                    value float64 `json:"value"`
                    units string  `json:"units"`
                } `json:"capacity"`
                classification string   `json:"classification"`
                sourceuuid     []string `json:"source_uuid"`
                clusters       []string `json:"clusters"`
                infrastructure struct {
                    raw struct {
                        value float64 `json:"value"`
                        units string  `json:"units"`
                    } `json:"raw"`
                    markup struct {
                        value float64 `json:"value"`
                        units string  `json:"units"`
                    } `json:"markup"`
                    usage struct {
                        value float64 `json:"value"`
                        units string  `json:"units"`
                    } `json:"usage"`
                    distributed struct {
                        value float64 `json:"value"`
                        units string  `json:"units"`
                    } `json:"distributed"`
                    total struct {
                        value float64 `json:"value"`
                        units string  `json:"units"`
                    } `json:"total"`
                } `json:"infrastructure"`
                supplementary struct {
                    raw struct {
                        value float64 `json:"value"`
                        units string  `json:"units"`
                    } `json:"raw"`
                    markup struct {
                        value float64 `json:"value"`
                        units string  `json:"units"`
                    } `json:"markup"`
                    usage struct {
                        value float64 `json:"value"`
                        units string  `json:"units"`
                    } `json:"usage"`
                    distributed struct {
                        value float64 `json:"value"`
                        units string  `json:"units"`
                    } `json:"distributed"`
                    total struct {
                        value float64 `json:"value"`
                        units string  `json:"units"`
                    } `json:"total"`
                } `json:"supplementary"`
                cost struct {
                    raw struct {
                        value float64 `json:"value"`
                        units string  `json:"units"`
                    } `json:"raw"`
                    markup struct {
                        value float64 `json:"value"`
                        units string  `json:"units"`
                    } `json:"markup"`
                    usage struct {
                        value float64 `json:"value"`
                        units string  `json:"units"`
                    } `json:"usage"`
                    distributed struct {
                        value float64 `json:"value"`
                        units string  `json:"units"`
                    } `json:"distributed"`
                    total struct {
                        value float64 `json:"value"`
                        units string  `json:"units"`
                    } `json:"total"`
                } `json:"cost"`
            } `json:"values"`
        } `json:"projects"`
    } `json:"data"`
}

这是我运行程序时得到的输出片段。正如您所看到的,日期、项目和内部循环(cpu 指标)会重复自身,而外部循环(内存指标)则会运行:

我正在寻找一个输出,其中每个项目只有一行(月份、项目、cpu 指标、内存指标)

Month, Project, CPU Request(Core hours), CPU Usage(Core hours) Memory Request(mBytes), Memory Usage(mBytes)
2022-12, amq-demo-streams, 0.0, 34.0, 0.0, 4353.2
2022-12, amq-demo-streams, 0.0, 34.0, 1115.6, 1081.4
2022-12, amq-demo-streams, 0.0, 34.0, 0.0, 10675.9
2022-12, amq-demo-streams, 0.0, 34.0, 100.9, 284.0
2022-12, amq-demo-streams, 0.0, 34.0, 0.0, 70064.5
2022-12, amq-demo-streams, 0.0, 34.0, 773088.9, 427757.8
2022-12, amq-demo-streams, 0.0, 34.0, 9440.0, 11610.3
2022-12, amq-demo-streams, 0.0, 34.0, 9471.3, 11696.9
2022-12, amq-demo-streams, 0.0, 34.0, 0.0, 2455.2
2022-12, amq-demo-streams, 0.0, 34.0, 0.0, 3.3
2022-12, amq-demo-streams, 0.0, 34.0, 0.0, 0.0
2022-12, amq-demo-streams, 0.0, 34.0, -0.3, 0.0
2022-12, amq-demo-streams, 0.0, 34.0, 3785.0, 6610.4
2022-12, amq-demo-streams, 0.0, 34.0, 252.3, 1007.8
2022-12, amq-demo-streams, 0.0, 34.0, 757.0, 883.0
2022-12, amq-demo-streams, 0.0, 34.0, 1009.4, 1613.4
2022-12, amq-demo-streams, 0.0, 34.0, 378.5, 413.5
2022-12, amq-demo-streams, 0.0, 34.0, 908.4, 2856.8
2022-12, amq-demo-streams, 0.0, 34.0, 252.3, 248.7
2022-12, amq-demo-streams, 0.0, 34.0, 66873.8, 21035.3
2022-12, amq-demo-streams, 0.0, 34.0, 353.3, 611.9
2022-12, amq-demo-streams, 0.0, 34.0, 10203.6, 12418.3
2022-12, amq-demo-streams, 0.0, 34.0, 504.7, 398.3
2022-12, amq-demo-streams, 0.0, 34.0, 1135.5, 2248.5
2022-12, amq-demo-streams, 0.0, 34.0, 252.3, 610.6
2022-12, amq-demo-streams, 0.0, 34.0, 252.3, 370.6

正确答案


我允许自己使用更简单的结构定义。您始终可以根据您的结构调整此代码。

type Cpu struct {
    Project string
    Data    []Data
}

type Memory struct {
    Project string
    Data    []Data
}

type Data struct {
    Date     string
    Projects []Project
}

type Project struct {
    Project string
    Values  []struct {
        Request float64
        Value   float64
    }
}

func CSVOutput(cpu Cpu, mem Memory) error {
    // Returns an error if cpu & memory's data are the same length
    if len(cpu.Data) != len(mem.Data) {
        return fmt.Errorf("cpu.Data and mem.Data don't have the same length")
    }

    // Printing CSV file header
    fmt.Println("Month, Project, CPU Request(Core hours), CPU Usage(Core hours) Memory Request(mBytes), Memory Usage(mBytes)")
    for i := range cpu.Data {
        cpuData := cpu.Data[i]
        memData := mem.Data[i]

        // Using the format from Errorf to add context to the error
        if len(cpuData.Projects) != len(memData.Projects) {
            return fmt.Errorf("cpu.Data[%d].Projects and mem.Data[%d].Projects don't have the same length", i, i)
        }

        for j := range cpuData.Projects {
            cpuProject := cpuData.Projects[j]
            memProject := memData.Projects[j]

            if len(cpuProject.Values) != len(memProject.Values) {
                return fmt.Errorf("cpu.Data[%d].Projects[%d].Values and mem.Data[%d].Projects[%d].Values don't have the same length", i, j, i, j)
            }

            name := cpuProject.Project
            date := cpuData.Date

            // Continue if the cpu project concerns openshift
            if strings.Contains(name, "openshift") {
                continue
            }

            for k := range cpuProject.Values {
                cpuValue := cpuProject.Values[k]
                memValue := memProject.Values[k]

                fmt.Printf("%s, %s, %.1f, %.1f, %.1f, %.1f", date, name, cpuValue.Request, cpuValue.Value, memValue.Request, memValue.Value)
            }
        }
    }

    return nil
}

只有当您接收到的cpu数据与内存数据一样多时,此代码才有效。
如果不是这种情况,您将必须找到一种方法将某个 cpu 的数据链接到其内存等效项。
如果您认为这种情况可能会出现,可以进一步讨论这个问题。

今天关于《如何正确循环 golang 中的两个嵌套 json 结构》的内容就介绍到这里了,是不是学起来一目了然!想要了解更多关于的内容请关注golang学习网公众号!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>