2016-10-04 1 views
0

У меня есть одна структура, которая привыкает к протобаузному сериализатору и работает хорошо.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), это работает нормально. Любые провода.?

+1

[Код в этом вопросе работает, как ожидается, на детской площадке] (https://play.golang.org/p/bXMCYqNq8A). –

+0

Спасибо @MellowMarmot. Я не размещал дополнительные структурные методы, такие как сброс и другие вещи в другом модуле. Могут ли такие линии иметь какое-либо значение? – Roshan

+1

Отправьте [полный и проверяемый пример] (http://stackoverflow.com/help/mcve). Код, который опубликовал, работает. Трудно догадаться, что не так с кодом, который мы не видим. –

ответ

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

+1

Это работает как код в вопросе. В чем преимущество использования разных типов элементов среза? Связанная с этим почта не рассматривает это. –

Смежные вопросы