Разоблачение JSON с элементами глубиной 2 слоя - PullRequest
0 голосов
/ 01 февраля 2019

Как вы извлекаете подразделы структуры JSON?

Я анализирую вызов API, который возвращает данные следующим образом (обрезано для краткости):

{
    "report": [
        {
            "item1": [
                {"name":"somename", "someint":"1", "somefloat":"2.0"}
            ]
        }
    ]
}

В Python я бы сделал это:

data = json.loads(myvar)['report'][0]['item1'][0] print data['name']

Как это делается в Go?Я не могу изменить или настроить вышестоящий API.

type MyData struct {
    name string
    someint int
    somefloat float
}

var x MyData

// If I print APICall.buff.Bytes() here I see the valid JSON object I want to parse.

if err := json.Unmarshal(APICall.buff.Bytes(), &MyData); err != nil {
    log.Fatal(err)
}

fmt.Printf("%+v\n", MyData)

Он работает успешно, но моя структура полна пустых ключей.

&{name: someint:0 somefloat:0}

1 Ответ

0 голосов
/ 01 февраля 2019

Вы можете использовать тип карты

var x map[string]interface{} // Adapt to match with the JSON structure

Или вы можете указать всю структуру вашего JSON

type Item struct {
   Name string `json:"name,omitempty"`
   Someint int `json:"Someint,omitempty"` // or string depend on the data type
   Somefloat float32 `json:"somefloat,omitempty"` // or string depend on the data type
}

type Report struct {
   Report     []map[string][]Item  `json:"report,omitempty"` // map[string] because it item1 so I assume it can be item2, item3...
}

Правильный код для ваших нужд:

package main

import (
    "fmt"
    "encoding/json"
)

func main() {
   type Item struct {
     Name string `json:"name,omitempty"`
     Someint string `json:"Someint,omitempty"` // or int depend on the data type
     Somefloat string `json:"somefloat,omitempty"` // or float32 depend on the data type
   }

   type Report struct {
      Report     []map[string][]Item  `json:"report,omitempty"` // map[string] because it item1 so I assume it can be item2, item3...
   }

   var x Report

   // If I print APICall.buff.Bytes() here I see the valid JSON object I want to parse.

   if err := json.Unmarshal([]byte(`{
    "report": [
        {
            "item1": [
                {"name":"somename1", "someint":"1", "somefloat":"2.0"},
                {"name":"somename2", "someint":"2", "somefloat":"3.0"}
            ],
            "item2": [
                {"name":"somename1", "someint":"1", "somefloat":"2.0"},
                {"name":"somename2", "someint":"2", "somefloat":"3.0"}
            ]
        }
    ]
   }`), &x); err != nil {
      fmt.Println(err)
   }

   fmt.Printf("%+v\n%+v", x, x.Report[0]["item1"][0])
}

Вывод:

{Report:[map[item1:[{Name:somename1 Someint:1 Somefloat:2.0} {Name:somename2 Someint:2 Somefloat:3.0}] item2:[{Name:somename1 Someint:1 Somefloat:2.0} {Name:somename2 Someint:2 Somefloat:3.0}]]]}

{Name:somename1 Someint:1 Somefloat:2.0}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...