arrays - 在GO中解析json对象数组

标签 arrays json parsing go slice

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

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

我不知道如何为其创建结构,我想出了:

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 数组解码为 Go slice 。因此,解码为 []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
}

它更短、更容易阅读并且更高效。

关于arrays - 在GO中解析json对象数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62438871/

相关文章:

python - 如何使用 Panda 将 JSON 字符串中的所有元素输出到表中

cocoa-touch - 在 iOS 上解析 64 位无符号整数

ios - 如果应用程序正在使用 GPS,即使应用程序处于后台,如何避免电池耗尽

用于解析干净 URL 并获取其不同组件的 Java 库/类

java - 如何使用 bufferedreader 和 treemap 打印文本中最常见的单词? - java

c - 用户输入的类型数组

javascript - 如何在使用固定结构时在 ngFor 中将索引值增加和更新 2

javascript - 无法将 JSON 响应数据分配给 AngularJS 中的 $scope 变量

javascript - 如何在 javascript 中使用结果集的值创建数组

c# - 当每个项目都用作对象时将 json 转换为 C# 类