Распаковка данных Json на карту в Go - PullRequest
0 голосов
/ 04 сентября 2018

Я имею дело с API, который возвращает данные JSON, такие как:

    {
  "bpi": {
    "2018-06-01": 128.2597,
    "2018-06-02": 127.3648
  },
  "disclaimer": "something here.",
  "time": {
    "updated": "Sep 6, 2013 00:03:00 UTC",
    "updatedISO": "2013-09-06T00:03:00+00:00"
  }

Однако данные о ценах, которые имеют сопровождающие даты, могут возвращать динамический диапазон дат (т. Е. Может быть что угодно от 1 пары данных до 1000).

Я пытаюсь взять только пары даты и цены и поместить их в карту для последующего потребления, но я не нахожу прямой способ сделать это. Когда я помещу это в генератор структуры автоматически, он создаст статически и названную структуру для оценки.

Это моя лучшая попытка динамической обработки данных. Я передаю пустой интерфейс из тела ответа http get, а именно:

var unstructuredJSON interface{} json.Unmarshal(body, &unstructuredJSON)

и передача неструктурированного JSON в функцию:

func buildPriceMap(unstructuredJSON interface{}, priceMap map[string]float64) {
jsonBody := unstructuredJSON.(map[string]interface{})

for k, v := range jsonBody {
    switch vv := v.(type) {
    case string:
        // Do Nothing
    case float64:
        priceMap[k] = vv
    case interface{}:
        buildPriceMap(vv, priceMap)
    default:
        log.Fatal("Json unknown data handling unmarshal error: ", k, vv)
    }
}

Есть ли лучший способ сделать это?

1 Ответ

0 голосов
/ 04 сентября 2018

Предполагая, что вы знаете клавиши верхнего уровня, например, bpi, disclaimer, time и т. Д. И что «динамические пары данных», о которых вы говорите, являются частью поля bpi, и что типы ключей и значений каждого из членов bpi всегда string: decimal number ты делаешь что-то вроде ....

type APIResp struct {
    BPI        map[string]float64 `json:"bpi"`
    Disclaimer string
    // other fields
}

Теперь каждая из ваших пар будет напечатана правильно и содержится на карте APIResp.BPI. Unmarshal, как вы уже делаете;

var r APIResp
err := json.Unmarshal(body, &r)
// TODO: check err
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...