在 GO 中解析 json 对象数组

Posted

技术标签:

【中文标题】在 GO 中解析 json 对象数组【英文标题】:Parsing an array of json objects in GO 【发布时间】:2020-10-07 20:30:50 【问题描述】:

我正在尝试将给定的 API 响应解析为一个结构。 好像是一个数组。

[
   
      "host_name" : "hostname",
      "perf_data" : "",
      "plugin_output" : "All good",
      "state" : 0
   
]

我不知道如何为它创建 struct,我想出了:

type ServiceData struct 
    HostName     string `json:"host_name"`
    PerfData     string `json:"perf_data"`
    PluginOutput string `json:"plugin_output"`
    State        int    `json:"state"`

defer resp.Body.Close()
buf := new(bytes.Buffer)
buf.ReadFrom(resp.Body)
jsonStr := buf.String()
var servicedata ServiceData
json.Unmarshal([]byte(jsonStr), &servicedata)

但没有运气。

我是否应该从初始响应中删除方括号? 有人能指出我正确的方向吗?

【问题讨论】:

只想注意 JSON 响应是一个包含单个对象的对象数组。您试图将其解析为单个对象并且失败了。根据下面的答案,创建一个变量和 ServiceData 数组可以解决问题。 【参考方案1】:

您可以将 JSON 数组解组为 Go 切片。所以解组为[]ServiceData[]*ServiceData 类型的值:

var servicedata []*ServiceData

一个工作演示:

func main() 
    var result []*ServiceData
    if err := json.Unmarshal([]byte(src), &result); err != nil 
        panic(err)
    
    fmt.Printf("%+v", result[0])


const src = `[
   
      "host_name" : "hostname",
      "perf_data" : "",
      "plugin_output" : "All good",
      "state" : 0
   
]`

哪些输出(在Go Playground 上试试):

&HostName:hostname PerfData: PluginOutput:All good State:0

还请注意,您可以“直接从正文”解组,无需先读取正文。

使用json.Decoder 来做到这一点:

var servicedata []*ServiceData
if err := json.NewDecoder(resp.Body).Decode(&result); err != nil 
    // handle error

它更短、更易于阅读且效率更高。

【讨论】:

这正是我所缺少的。谢谢

以上是关于在 GO 中解析 json 对象数组的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Go 中将 JSON 对象数组转换为具有默认值的结构数组?

使用数组根对象在 Swift 中解析 JSON 数组

在 NodeJS 中解析 JSON 对象数组

在 JSON 对象中解析 JSON 数组

当对象包含其他对象数组时如何解析 JSON?

如何在 Android 中解析 JSON 数组(不是 Json 对象)