Unmarshaling заусеницы JSON - PullRequest
       0

Unmarshaling заусеницы JSON

0 голосов
/ 29 апреля 2018

Я пытаюсь демонтировать JSON с вложенным JSON.

Я использую эту структуру

type atomRequest struct {
    Stream string                 `json:"stream"`
    Data   map[string]interface{} `json:"data"`
}

если вложенный json является строковым, Unmasrhaling завершается неудачно и значение равно nil

если байтовый массив, в котором я выполняю маршалинг, не содержит экранированных «данных» Карта «Данные» заполняется правильно.

если вложенный json является строковым, я получаю пустую карту данных.

Я ищу решение для демонтажа вложенных данных, независимо от того, являются ли они строковыми или нет.

Пример: этот вход работает:

{"stream":"foobar","data":{"errorID":112,"timestamp":1524737466}}

Этот ввод не работает:

{
    "stream": "foo",
    "data": "{\"cd3\":\"514\",\"cd8\":\"none\"}"
}

Вы можете помочь?

спасибо

1 Ответ

0 голосов
/ 29 апреля 2018

Используйте json.RawMessage , чтобы захватить переменное поле:

type atomRequest struct {
    Stream  string                 `json:"stream"`
    RawData json.RawMessage        `json:"data"`
    Data    map[string]interface{} `json:"-"`
}

Разобрать JSON верхнего уровня:

var req atomRequest
if err := json.Unmarshal(data, &req); err != nil {
    // handle error
}

Если data - строка, удалите маршалинг для удаления дополнительного уровня кодировки:

if len(req.RawData) > 0 && req.RawData[0] == '"' {
    var s string
    if err := json.Unmarshal(req.RawData, &s); err != nil {
        // handle error
    }
    req.RawData = json.RawMessage(s)
}

Наконец, демаршал к map[string]interface{}:

if err := json.Unmarshal(req.RawData, &req.Data); err != nil {
    // handle error
}

пример детской площадки

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