在 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 对象数组的主要内容,如果未能解决你的问题,请参考以下文章