Saya mencoba mengurai respons API yang diberikan ke dalam sebuah struct. Tampaknya menjadi sebuah array.

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

Saya tidak tahu cara membuat struct untuk itu, saya menemukan:

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)

Tapi tidak beruntung.

Haruskah saya menghapus tanda kurung siku dari respons awal? Bisakah seseorang mengarahkan saya ke arah yang benar?

2
Maciej Golkowski 18 Juni 2020, 00:45

1 menjawab

Jawaban Terbaik

Anda dapat menghapus susunan JSON ke dalam irisan Go. Jadi unmarshal menjadi nilai tipe []ServiceData atau []*ServiceData:

var servicedata []*ServiceData

Demo yang berfungsi:

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
   }
]`

Output mana (coba di Go Playground):

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

Perhatikan juga bahwa Anda dapat menghapus "langsung dari tubuh", tidak perlu membaca tubuh terlebih dahulu.

Gunakan json.Decoder untuk melakukannya:

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

Ini jauh lebih pendek, lebih mudah dibaca dan lebih efisien.

5
icza 18 Juni 2020, 00:14