Разбор массива json объектов в GO - PullRequest
2 голосов
/ 18 июня 2020

Я пытаюсь преобразовать данный ответ 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)

Но не повезло.

Может, стоит убрать квадратные скобки из первоначального ответа? Может ли кто-нибудь указать мне правильное направление?

1 Ответ

5 голосов
/ 18 июня 2020

Вы можете разупорядочить 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 Игровая площадка ):

&{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
}

Это намного короче, легче для чтения и эффективнее.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...