当前位置:首页 > 文章列表 > Golang > Go问答 > 如何正确循环 golang 中的两个嵌套 json 结构

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

来源:stackoverflow 2024-04-10 20:48:34 0浏览 收藏

从现在开始,我们要努力学习啦!今天我给大家带来《如何正确循环 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删除
在处理程序之后访问 HTTP 请求上下文在处理程序之后访问 HTTP 请求上下文
上一篇
在处理程序之后访问 HTTP 请求上下文
PHP 函数的元素组成:详解
下一篇
PHP 函数的元素组成:详解
查看更多
最新文章
查看更多
课程推荐
  • 前端进阶之JavaScript设计模式
    前端进阶之JavaScript设计模式
    设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
    542次学习
  • GO语言核心编程课程
    GO语言核心编程课程
    本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
    508次学习
  • 简单聊聊mysql8与网络通信
    简单聊聊mysql8与网络通信
    如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
    497次学习
  • JavaScript正则表达式基础与实战
    JavaScript正则表达式基础与实战
    在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
    487次学习
  • 从零制作响应式网站—Grid布局
    从零制作响应式网站—Grid布局
    本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
    484次学习
查看更多
AI推荐
  • 笔灵AI生成答辩PPT:高效制作学术与职场PPT的利器
    笔灵AI生成答辩PPT
    探索笔灵AI生成答辩PPT的强大功能,快速制作高质量答辩PPT。精准内容提取、多样模板匹配、数据可视化、配套自述稿生成,让您的学术和职场展示更加专业与高效。
    30次使用
  • 知网AIGC检测服务系统:精准识别学术文本中的AI生成内容
    知网AIGC检测服务系统
    知网AIGC检测服务系统,专注于检测学术文本中的疑似AI生成内容。依托知网海量高质量文献资源,结合先进的“知识增强AIGC检测技术”,系统能够从语言模式和语义逻辑两方面精准识别AI生成内容,适用于学术研究、教育和企业领域,确保文本的真实性和原创性。
    45次使用
  • AIGC检测服务:AIbiye助力确保论文原创性
    AIGC检测-Aibiye
    AIbiye官网推出的AIGC检测服务,专注于检测ChatGPT、Gemini、Claude等AIGC工具生成的文本,帮助用户确保论文的原创性和学术规范。支持txt和doc(x)格式,检测范围为论文正文,提供高准确性和便捷的用户体验。
    40次使用
  • 易笔AI论文平台:快速生成高质量学术论文的利器
    易笔AI论文
    易笔AI论文平台提供自动写作、格式校对、查重检测等功能,支持多种学术领域的论文生成。价格优惠,界面友好,操作简便,适用于学术研究者、学生及论文辅导机构。
    53次使用
  • 笔启AI论文写作平台:多类型论文生成与多语言支持
    笔启AI论文写作平台
    笔启AI论文写作平台提供多类型论文生成服务,支持多语言写作,满足学术研究者、学生和职场人士的需求。平台采用AI 4.0版本,确保论文质量和原创性,并提供查重保障和隐私保护。
    43次使用
微信登录更方便
  • 密码登录
  • 注册账号
登录即同意 用户协议隐私政策
返回登录
  • 重置密码