Mac*_*ski 2 arrays parsing json go slice
我正在尝试将给定的 API 响应解析为一个结构体。它似乎是一个数组。
[
{
"host_name" : "hostname",
"perf_data" : "",
"plugin_output" : "All good",
"state" : 0
}
]
Run Code Online (Sandbox Code Playgroud)
我不知道如何为它创建结构,我想出了:
type ServiceData struct {
HostName string `json:"host_name"`
PerfData string `json:"perf_data"`
PluginOutput string `json:"plugin_output"`
State int `json:"state"`
}
Run Code Online (Sandbox Code Playgroud)
defer resp.Body.Close()
buf := new(bytes.Buffer)
buf.ReadFrom(resp.Body)
jsonStr := buf.String()
var servicedata ServiceData
json.Unmarshal([]byte(jsonStr), &servicedata)
Run Code Online (Sandbox Code Playgroud)
但没有运气。
我应该从初始响应中删除方括号吗?有人能指出我正确的方向吗?
您可以将 JSON 数组解组为 Go 切片。因此解组为类型[]ServiceData
or的值[]*ServiceData
:
var servicedata []*ServiceData
Run Code Online (Sandbox Code Playgroud)
一个工作演示:
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
}
]`
Run Code Online (Sandbox Code Playgroud)
哪些输出(在Go Playground上试试):
&{HostName:hostname PerfData: PluginOutput:All good State:0}
Run Code Online (Sandbox Code Playgroud)
另请注意,您可以“直接从正文”解组,无需先阅读正文。
使用json.Decoder
这样做:
var servicedata []*ServiceData
if err := json.NewDecoder(resp.Body).Decode(&result); err != nil {
// handle error
}
Run Code Online (Sandbox Code Playgroud)
它更短,更容易阅读,而且效率更高。