У меня есть одна структура, которая привыкает к протобаузному сериализатору и работает хорошо.Golang: Protobuff сгенерированный Struct не расшифровывает дочерний атрибут для json.Unmarshling
Эта структура порождается protobuff, следовательно, он так много методов, как распаковать и т.д.
type Flight struct {
FlightNo string `json:"flightno, omitempty"`
Carrier string `json:"carrier, omitempty"`
}
func (m *Flight) Unmarshal(data []byte) error {
l := len(data)
iNdEx := 0
for iNdEx < l {
preIndex := iNdEx
var wire uint64
for shift := uint(0); ; shift += 7 {
if shift >= 64 {
return ErrIntOverflowFlight
}
if iNdEx >= l {
return io.ErrUnexpectedEOF
}
b := data[iNdEx]
iNdEx++
wire |= (uint64(b) & 0x7F) << shift
if b < 0x80 {
break
}
}
}
// some more code
}
Тогда я хочу, чтобы добавить дополнительное поле к этой информации полета,
type FlightMeta struct {
Source string `json:"source, omitempty"`
Destination string `json:"destination, omitempty"`
}
Тогда я объединил структура этих двух,
type CombinedFlight struct {
Flight
FlightMeta
}
type ResponseFlight struct {
OnwardFlights []CombinedFlight `json:"onwardflights, omitempty"`
ReturnFlights []CombinedFlight `json:"returnflights, omitempty"`
Error string `json:"error, omitempty"`
}
Итак, когда я прочитал некоторые данные, например,
str "= `{"onwardflights": [{"flightno": "537", "carrier": "AI", "source": "BOM", "destination": "DEL"}], "error": "false"}`
respFlight = new(ResponseFlight)
err = json.Unmarshal([]byte(str), &respFlight)
fmt.Println("flightno:", respFlight.OnwardFlights[0].FlightNo, "flight source", respFlight.OnwardFlights[0].Source)
#prints "flightno:537 flight source:
Он не печатает значение для второй структуры, так как methis не расправляется должным образом.
Но когда я устанавливаю атрибут вручную и маршал (закодируйте его на json), это работает нормально. Любые провода.?
[Код в этом вопросе работает, как ожидается, на детской площадке] (https://play.golang.org/p/bXMCYqNq8A). –
Спасибо @MellowMarmot. Я не размещал дополнительные структурные методы, такие как сброс и другие вещи в другом модуле. Могут ли такие линии иметь какое-либо значение? – Roshan
Отправьте [полный и проверяемый пример] (http://stackoverflow.com/help/mcve). Код, который опубликовал, работает. Трудно догадаться, что не так с кодом, который мы не видим. –