json - 使用 2 层深的元素解码 JSON

标签 json go

如何提取 JSON 结构的子部分?

我正在解析一个以下列方式返回数据的 API 调用(为简洁起见进行了删减):

{
    "report": [
        {
            "item1": [
                {"name":"somename", "someint":"1", "somefloat":"2.0"}
            ]
        }
    ]
}

所以在 python 中我会这样做:

data = json.loads(myvar)['report'][0]['item1'][0] 打印数据['名称']

这是如何在 Go 中完成的?我无法更改或调整上游 API。

type MyData struct {
    name string
    someint int
    somefloat float
}

var x MyData

// If I print APICall.buff.Bytes() here I see the valid JSON object I want to parse.

if err := json.Unmarshal(APICall.buff.Bytes(), &MyData); err != nil {
    log.Fatal(err)
}

fmt.Printf("%+v\n", MyData)

这运行成功,但我的结构充满了空键。

&{name: someint:0 somefloat:0}

最佳答案

可以使用 map 类型

var x map[string]interface{} // Adapt to match with the JSON structure

或者您可以详细说明 JSON 的所有结构

type Item struct {
   Name string `json:"name,omitempty"`
   Someint int `json:"Someint,omitempty"` // or string depend on the data type
   Somefloat float32 `json:"somefloat,omitempty"` // or string depend on the data type
}

type Report struct {
   Report     []map[string][]Item  `json:"report,omitempty"` // map[string] because it item1 so I assume it can be item2, item3...
}

您需要的正确代码:

package main

import (
    "fmt"
    "encoding/json"
)

func main() {
   type Item struct {
     Name string `json:"name,omitempty"`
     Someint string `json:"Someint,omitempty"` // or int depend on the data type
     Somefloat string `json:"somefloat,omitempty"` // or float32 depend on the data type
   }

   type Report struct {
      Report     []map[string][]Item  `json:"report,omitempty"` // map[string] because it item1 so I assume it can be item2, item3...
   }

   var x Report

   // If I print APICall.buff.Bytes() here I see the valid JSON object I want to parse.

   if err := json.Unmarshal([]byte(`{
    "report": [
        {
            "item1": [
                {"name":"somename1", "someint":"1", "somefloat":"2.0"},
                {"name":"somename2", "someint":"2", "somefloat":"3.0"}
            ],
            "item2": [
                {"name":"somename1", "someint":"1", "somefloat":"2.0"},
                {"name":"somename2", "someint":"2", "somefloat":"3.0"}
            ]
        }
    ]
   }`), &x); err != nil {
      fmt.Println(err)
   }

   fmt.Printf("%+v\n%+v", x, x.Report[0]["item1"][0])
}

输出:

{Report:[map[item1:[{Name:somename1 Someint:1 Somefloat:2.0} {Name:somename2 Someint:2 Somefloat:3.0}] item2:[{Name:somename1 Someint:1 Somefloat:2.0} {Name:somename2 Someint:2 Somefloat:3.0}]]]}

{Name:somename1 Someint:1 Somefloat:2.0}

关于json - 使用 2 层深的元素解码 JSON,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54480019/

相关文章:

java - 从 Java 中的嵌套空对象创建示例 JSON

json - 为 json 对象声明一个结构

ruby-on-rails - 在事件模型序列化程序中禁用 root

go - 什么时候应该使用 ParseForm,什么时候应该使用 FormValue 和 PostFormValue?

go - 如何知道延迟函数是在成功执行函数后调用还是被 panic 调用

firebase - 在 golang 应用程序中初始化 firebase 时出错

json - 如何在 Swift 中间接显示给定的 unicode 字符?

arrays - 获取 JSON 数组的最大值并将其存储在 Data Vue 中

variables - golang -- 初始化项目变量

go - 为什么 Golang http 参数 (URL.Query()) 是列表的映射?