1.Поскольку он видит объект JSON, и, как задокументировано, объект JSON становится map[string]interface{}
при сохранении в interface{}
(это единственный тип, который может содержать все, что находится в объекте JSON в целом).
2.Учитывая текущую ситуацию, вы можете назначить каждое поле карты соответствующему полю нового Data1
или Data2
.
3.Идеальный способ справиться с этим - использовать json.RawMessage
для отсрочки декодирования Data
, пока вы не узнаете, что это такое.Это может быть обработано следующим образом:
type Msg struct {
MsgType int
Data interface{}
}
func (m *Msg) UnmarshalJSON(b []byte) (err error) {
var tmp struct {
MsgType int
Data json.RawMessage
}
err = json.Unmarshal(b, &tmp)
if err != nil {
return
}
m.MsgType = tmp.MsgType
switch (tmp.MsgType) {
case 1:
data := Data1{}
err = json.Unmarshal(tmp.Data, &data)
if err != nil {
return
}
m.Data = data
case 2:
data := Data2{}
err = json.Unmarshal(tmp.Data, &data)
if err != nil {
return
}
m.Data = data
default:
return errors.New("invalid DataType")
}
return
}
И тогда вы можете позвонить json.Unmarshal
или json.Decode
непосредственно на *Msg
, и его Data
будет декодирован, как вы хотите.