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ę:
- Implementować
UnmarshalJSON
naResult
. - Analiza
Bar
jako[]*json.RawMessage
. - Analizowanie każdej nieprzetworzonej wiadomości pod numerem
map[string]interface{}
. - Sprawdź pole "typ" w nieprzetworzonej wiadomości.
- Utwórz strukturę odpowiedniego typu.
- 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?
Skończyło się na tym, że mam strukturę "union". Czuł się brudny, ale w końcu wyzwolił. –