Голанг: сгенерированный 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, если оно имеет те же объекты

Другие вопросы по тегам