Есть ли способ динамически демаршалировать базу json на контенте?

У меня есть формат json, который выглядит так

{
    "my_object_list": [
        {
            "meta": {"version": 1},
            "my_value": {// Some complex value
            }
        }
        {
            "meta": {"version": 2},
            "my_value": {// Some complex value
            }
        }
    ]
}

Я хочу иметь возможность маршалировать каждую из my_value баз на meta. Есть ли способ добиться этого в golang?

type MyResponse struct {
    // how to I unmarshal each myObject base on version?
    MyObjectList     []myObject   `json:"my_object_list"`
}

person user10714010    schedule 24.09.2019    source источник
comment
Можете ли вы предоставить пример вывода для данного ввода json? Просто чтобы быть уверенным, какие изменения вы хотите внести в my_value.   -  person Kamol Hasan    schedule 24.09.2019


Ответы (1)


Разместите переменную часть в json.RawMessage. Прокрутите данные и рассортируйте необработанные данные сообщения до типа, основанного на версии.

type V1Value struct{}

type myObject struct {
    Meta struct {
        Version int `json:"version"`
    } `json:"meta"`
    RawValue json.RawMessage `json:"my_value"`
    Value    interface{} `json:"-"`
}

type MyResponse struct {
    MyObjectList []*myObject `json:"my_object_list"`
}


...

var response MyResponse
if err := json.Unmarshal(data, &response); err != nil {
     // handle error
}
for _, o := range response.MyObjectList {
    switch o.Meta.Version {
    case 1:
        var v V1Value
        if err := json.Unmarshal(o.RawValue, &v); err != nil {
            // handle error
        }
        o.Value = v
    default:
        // handle unknown version
    }
}
person Cerise Limón    schedule 24.09.2019
comment
вариант, использующий интерфейс unmarshaler play.golang.com/p/WolxQKnSyJD - person mkopriva; 24.09.2019