Golang:Protobuff生成的Struct不解码json.Unmarshling的子属性

时间:2016-10-04 11:43:45

标签: json go unmarshalling

我有一个与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:

它不会打印第二个结构的值,因为根据methis并不能正确地修改。

但是当我手动设置属性并编组(将其编码为json)时,这工作正常。 任何线索。?

1 个答案:

答案 0 :(得分:0)

尝试这样做

        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"`
        }

它会正常工作,如果你想编组,你必须创建两个不同的结构。有关更多信息,请参阅此帖子

访问Initialize nested struct definition in Golang if it have same objects