2013-04-14 11 views
7

Chcę deserialise obiekt, który zawiera tablicę z jakimś interfejsem Entity:unmarshal tablicą JSON heterogenicznych strukturach

type Result struct { 
    Foo int; 
    Bar []Entity; 
}; 

Entity jest interfejs, który jest realizowany przez szereg struct typów. Dane JSON identyfikują typ struktury z polem "typ" w każdej jednostce. Na przykład.

{"type":"t1","field1":1} 
{"type":"t2","field2":2,"field3":3} 

Jak bym go o deserialising typ Result w taki sposób, że prawidłowo wypełnia tablicę. Z tego co widzę, muszę:

  1. Implementować UnmarshalJSON na Result.
  2. Analiza Bar jako []*json.RawMessage.
  3. Analizowanie każdej nieprzetworzonej wiadomości pod numerem map[string]interface{}.
  4. Sprawdź pole "typ" w nieprzetworzonej wiadomości.
  5. Utwórz strukturę odpowiedniego typu.
  6. Ponownie przeanalizuj nieprzetworzoną wiadomość , tym razem w utworzonej strukturze.

Wszystko to brzmi bardzo nużąco i nudno. Czy jest lepszy sposób to zrobić? Czy robię to od tyłu, i istnieje bardziej kanoniczna metoda radzenia sobie z szeregiem heterogenicznych obiektów?

Odpowiedz

5

Myślę, że Twój proces jest prawdopodobnie nieco bardziej skomplikowany, niż być musi, patrz http://play.golang.org/p/0gahcMpuQc. Pojedyncza mapa [string] interface {} poradzi sobie z tym wiele.

Alternatywnie, można zrobić typ jak

struct EntityUnion { 
    Type string 
    // Fields from t1 
    // Fields from t2 
    // ... 
} 

unmarshal do tego; ustawi łańcuch Typ i wypełni wszystkie pola, które może uzyskać z danych JSON. Następnie wystarczy mała funkcja, aby skopiować pola do określonego typu.

+0

Skończyło się na tym, że mam strukturę "union". Czuł się brudny, ale w końcu wyzwolił. –

Powiązane problemy