Как распаковать с разными типами одной и той же переменной

Я работаю с API с возможным выводом:

[
 {
  "contactId": 2,
  "email": "karina.plain@example.com",
  "markerName": "JavascriptEngine",
  "dataType": "String",
  "value": "Carakan",
  "dateEntered": "2013-01-03T14:52:00"
 },
{
  "contactId": 2,
  "email": "karina.plain@example.com",
  "markerName": "HasReadEntireMessage",
  "dataType": "Boolean",
  "value": true,
  "dateEntered": "2013-01-03T18:02:00"
 }]

У меня есть проблема со значением. Как должна выглядеть структура, которая позволит этому JSON быть демаршалированным по отношению к его массиву?

2 ответа

Поскольку значение ключа "значение" может быть любого типа, следует использовать тип interface{} для этого поля. Это пустой интерфейс, который соответствует любому типу, который реализует как минимум нулевые методы, который является любым типом.

Таким образом, вы можете использовать тип:

type Contact struct {
    ContactId   int         `json:"contactId"`
    Email       string      `json:"email"`
    MarkerName  string      `json:"markerName"`
    DataType    string      `json:"dataType"`
    Value       interface{} `json:"value"`
    DateEntered string      `json:"dateEntered"`
}

Смотрите этот рабочий пример.

type Template []struct {
    ContactID   int    `json:"contactId"`
    Email       string `json:"email"`
    MarkerName  string `json:"markerName"`
    DataType    string `json:"dataType"`
    Value       string `json:"value"`
    DateEntered string `json:"dateEntered"`
}

Или же

type Template []struct {
    ContactID   int    `json:"contactId"`
    Email       string `json:"email"`
    MarkerName  string `json:"markerName"`
    DataType    string `json:"dataType"`
    Value       bool   `json:"value"`
    DateEntered string `json:"dateEntered"`
}
Другие вопросы по тегам