Unmarshal JSON в структуру с несколькими встроенными структурами и перекрывающимися именами полей - PullRequest
0 голосов
/ 28 октября 2019

Я пытаюсь проанализировать ответ API, где ответ может быть двух разных типов.

В схеме JSON API этот ответ определяется следующим образом ():

"account_user_settings": {
      "type": "object",
      "allOf": [
        {
          "$ref": "objects.json#/definitions/users_user_min"
        },
        {
          "$ref": "objects.json#/definitions/users_user_settings_xtr"
        }
      ]
    }

ИтакЯ определил несколько типов:

type AccountUserSettings struct {
    UsersUserMin
    UsersUserSettingsXtr
}

type UsersUserMin struct {
    FirstName       string `json:"first_name"`
    Id              int    `json:"id"`
    LastName        string `json:"last_name"`
}

type UsersUserSettingsXtr struct {
    Bdate            string  `json:"bdate"`
    City             string  `json:"city"`
    Country          string  `json:"country"`
    FirstName        string  `json:"first_name"`
    LastName         string  `json:"last_name"`
    Phone            string  `json:"phone"`
}

Ответ содержит JSON, похожий на этот (были изменены только значения):

Первый возможный вариант (полный):

{
    "first_name": "John",
    "last_name": "Doe",
    "bdate": "9.3.1950",
    "city": "New York",
    "country": "USA",
    "phone": "+1 234 567 8910",
}

Второйопция (частичная):

{
    "first_name": "John",
    "last_name": "Doe",
    "id": 123
}

Проблема в том, что в этой конфигурации я всегда пропускаю значения для полей FirstName и LastName после демаршалинга.

Если я исключаю из встроенноготипы из консолидирующего типа (AccountUserSettings), тогда он работает нормально и все поля заполнены правильно.

У меня есть только один вариант, как решить эту проблему, и не думаю, что это достаточно хорошо - не надоиспользовать встраивание и подключить все поля непосредственно в AccountUserSettings.

Может быть, есть какие-либо другие варианты, которые вы знаете для подобных случаев?

...