Корректировка структуры при отключении json в go

#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