Как распаковать с разными типами одной и той же переменной
Я работаю с 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"`
}