在 GO 中解析一组 json 对象

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)

但没有运气。

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

icz*_*cza 5

您可以将 JSON 数组解组为 Go 切片。因此解组为类型[]ServiceDataor的值[]*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)

它更短,更容易阅读,而且效率更高。