JSON Вложенные динамические структуры Go декодирование - PullRequest
0 голосов
/ 23 мая 2019

Есть пример ввода данных.

{
    "status": "OK",
    "status_code": 100,
    "sms": {
        "79607891234": {
            "status": "ERROR",
            "status_code": 203,
            "status_text": "Нет текста сообщения"
        },
        "79035671233": {
            "status": "ERROR",
            "status_code": 203,
            "status_text": "Нет текста сообщения"
        },
        "79105432212": {
            "status": "ERROR",
            "status_code": 203,
            "status_text": "Нет текста сообщения"
        }
    },
    "balance": 2676.18
}
type SMSPhone struct {
    Status     string `json:"status"`
    StatusCode int    `json:"status_code"`
    SmsID      string `json:"sms_id"`
    StatusText string `json:"status_text"`
}
type SMSSendJSON struct {
    Status     string     `json:"status"`
    StatusCode int        `json:"status_code"`
    Sms        []SMSPhone `json:"sms"`
    Balance    float64    `json:"balance"`
}

Это пример данных, которые я получаю после соответствующего запроса к серверу.И я получаю такие данные.Как можно сериализовать такие данные?Моя попытка не удалась из-за динамических имен списка вложенных структур.Как правильно обрабатывать такие вложенные динамические структуры?

1 Ответ

3 голосов
/ 23 мая 2019

Используйте карту (типа map[string]SMSPhone) для моделирования объекта sms в JSON:

type SMSPhone struct {
    Status     string `json:"status"`
    StatusCode int    `json:"status_code"`
    StatusText string `json:"status_text"`
}

type SMSSendJSON struct {
    Status     string              `json:"status"`
    StatusCode int                 `json:"status_code"`
    Sms        map[string]SMSPhone `json:"sms"`
    Balance    float64             `json:"balance"`
}

Тогда немаршалинг:

var result SMSSendJSON

if err := json.Unmarshal([]byte(src), &result); err != nil {
    panic(err)
}
fmt.Printf("%+v", result)

Результат (попробуйте на Go Playground ):

{Status: OK StatusCode: 100 Sms: map [79035671233: {Status: ERROR StatusCode: 203 StatusText: Нет текста сообщения} 79105432212: {Status: ERROR StatusCode: 203 StatusText: Нет текста сообщения} 79607891234: {Status: ERROR StatusCode: 203 StatusText: Нет текста сообщения}] Баланс: 2676.18}

Ключи на карте result.Sms являются «динамическими» свойствами объекта, а именно телефонными номерами.

См. Связанные вопросы:

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

Как демонтировать JSON с неизвестными именами полей для структурирования в golang?

Unmarshal JSON с неизвестными полями

Unmarshal json string в структуру, которая имеет один элемент самой структуры

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