#json #go
# #json #Вперед
Вопрос:
Отключите JSON (который я не контролирую) следующим образом:
{
"states": {
"state": [
{ ...}
]
}
}
в структуру, подобную:
type Device struct {
States struct{ State []State }
}
var dev Device
Я получаю уродливый синтаксис для доступа к состоянию:
dev.States.State[0]
Я хотел бы иметь возможность преобразовывать объект, чтобы я мог делать
dev.States[0]
Можно ли это сделать с помощью тегов (опущенных в приведенном выше примере, потому что они не нужны) или с помощью другого метода, или я должен сначала отменить сопоставление со структурой, подобной приведенной выше, а затем вручную переназначить структуру так, как я хочу?
Ответ №1:
Все, что вам нужно сделать, это реализовать интерфейс Unmarshaler, просто добавив метод UnmarshalJSON(data []byte) error
и включив логику, которая вам нужна после отмены маршалирования; и если вы хотите выполнить обратную операцию (маршалирование), просто реализуйте интерфейс Marshaler.
type State struct {
Name string `json:"name"`
}
type Device struct {
States []State
}
func (dev *Device) UnmarshalJSON(data []byte) error {
// anonymous struct with the real backbone of the json
tmp := struct {
States struct {
State []State `json:"state"`
} `json:"states"`
}{}
if err := json.Unmarshal(data, amp;tmp); err != nil {
return err
}
dev.States = tmp.States.State
return nil
}
Полный пример: https://play.golang.org/p/gNpS13ED_i