Подтвердить что ты не робот

Как разобрать/десериализовать динамический JSON

Сценарий:
Рассмотрим следующее JSON:

{
   "Bangalore_City": "35_Temperature",
   "NewYork_City": "31_Temperature",
   "Copenhagen_City": "29_Temperature"
}

Если вы заметили, данные структурированы таким образом, что нет жестко закодированных ключей, которые бы указывали City/Temperature основном это просто значения.

Проблема: я не могу проанализировать любой динамический JSON.

Вопрос: мог ли кто-нибудь найти решение для такого анализа JSON? Я пытался идти-simplejson, Gabs & умолчанию encoding/json, но не повезло.

Примечание: приведенный выше JSON только для примера. И есть много приложений, которые используют текущий API, поэтому я не хочу менять структуру данных. Я имею в виду, я не могу изменить что-то следующим образом:

[{
   "City_Name":"Bangalore",
   "Temperature": "35"
},...]

Тогда я могу определить struct

type TempData struct {
  City_Name string
  Temperature  string
}
4b9b3361

Ответ 1

Вы можете распаковать в map[string]string например:

m := map[string]string{}
err := json.Unmarshal([]byte(input), &m)
if err != nil {
    panic(err)
}
fmt.Println(m)

Выход (завернутый):

map[Bangalore_City:35_Temperature NewYork_City:31_Temperature
    Copenhagen_City:29_Temperature]

Попробуйте это на игровой площадке Go.

Таким образом, независимо от того, какие ключи или значения, у вас будут все пары на map которые вы можете распечатать или зациклить.

Также обратите внимание, что хотя ваш пример содержал только string значения, но если тип значения варьируется (например, string, числа и т.д.), Вы можете использовать interface{} для типа значения, и в этом случае ваша карта будет иметь тип map[string]interface{}.

Также обратите внимание, что я создал библиотеку для удобной работы с такими динамическими объектами, которая может быть очень полезна в этих случаях: github.com/icza/dyno.

Ответ 2

Стандартное encoding/json подходит для большинства случаев использования, но может быть довольно медленным по сравнению с альтернативными решениями. Если вам нужна производительность, попробуйте использовать fastjson. Он анализирует произвольные JSON без необходимости создания структур или карт, соответствующих схеме JSON.

Смотрите пример кода ниже. Он перебирает все пары (key, value) объекта JSON:

var p fastjson.Parser
v, err := p.Parse(input)
if err != nil {
    log.Fatal(err)
}

// Visit all the items in the top object
v.GetObject().Visit(func(k []byte, v *fastjson.Value) {
    fmt.Printf("key=%s, value=%s\n", k, v)

    // for nested objects call Visit again
    if string(k) == "nested" {
        v.GetObject().Visit(func(k []byte, v *fastjson.Value) {
            fmt.Printf("nested key=%s, value=%s\n", k, v)
        })
    }
})