Голанг: сгенерированный Protobuff Struct не декодирует дочерний атрибут для json.Unmarshling
У меня есть одна структура, которая используется с сериализатором Protobuff и работает хорошо.
Эта структура генерируется protobuff, следовательно, она имеет так много методов, как Unmarshal и т. Д.
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:
Он не печатает значение для второй структуры, так как в соответствии с метисом не выглядит должным образом.
Но когда я устанавливаю атрибут вручную и маршал (кодирую его в json), это работает нормально. Любые ведет.?
1 ответ
Попробуй сделать это
type CombinedFlight1 struct {
Flight
FlightMeta
}
type CombinedFlight2 struct {
Flight
FlightMeta
}
type ResponseFlight struct {
OnwardFlights []CombinedFlight1 `json:"onwardflights, omitempty"`
ReturnFlights []CombinedFlight2 `json:"returnflights, omitempty"`
Error string `json:"error, omitempty"`
}
Это будет работать нормально, и если вы хотите выполнить маршал, вам нужно создать две разные структуры. Для большего понимания смотрите этот пост
Посетите Инициализировать определение вложенной структуры в Golang, если оно имеет те же объекты