2016-11-22 2 views
0

Si vous avez la structure JSON suivante:Comment décoder JSON en fonction du type d'objet dans golang

[ 
    { 
    "type": "home", 
    "name": "house #1", 
    ... some number of properties for home #1 
    }, 
    { 
    "type": "bike", 
    "name": "trek bike #1", 
    ... some number of properties for bike #1 
    }, 
    { 
    "type": "home", 
    "name": "house #2", 
    ... some number of properties for home #2 
    } 
] 

Comment décodent-vous cela dans golang à un struct sans savoir ce que chaque type est jusqu'à ce que vous unmarshall l'objet. Il semble que vous deviez faire ceci unmarshalling deux fois. En outre, d'après ce que je peux dire, je devrais probablement utiliser RawMessage pour retarder le décodage. Mais je ne suis pas sûr à quoi cela ressemblerait.

Dire que je les avais struct suivants:

type HomeType struct { 
    Name     string  `json:"name,omitempty"` 
    Description   string  `json:"description,omitempty"` 
    Bathrooms    string  `json:"bathrooms,omitempty"` 
    ... more properties that are unique to a home 
} 

type BikeType struct { 
    Name     string  `json:"name,omitempty"` 
    Description   string  `json:"description,omitempty"` 
    Tires     string  `json:"tires,omitempty"` 
    ... more properties that are unique to a bike 
} 

deuxième question. Est-il possible de le faire en mode streaming? Pour quand ce tableau est vraiment grand?

Merci

+0

S'il y a un champ « type », et tous les attributs sont des chaînes, pourquoi ne pas simplement unmarshal dans la carte '[] string [chaîne] '? – JimB

+0

Imaginez les objets JSON ayant beaucoup de propriétés, y compris les sous-objets et les tableaux d'objets. – jordan2175

Répondre

2

Si vous souhaitez manipuler les objets que vous devez savoir quel type ils sont. Mais si vous voulez seulement les passer, par exemple: Si vous obtenez de DB certains gros objet que pour Marshal et passer à côté client, vous pouvez utiliser un type interface{} vide:

type HomeType struct { 
    Name     interface{}  `json:"name,omitempty"` 
    Description   interface{}  `json:"description,omitempty"` 
    Bathrooms    interface{}  `json:"bathrooms,omitempty"` 
    ... more properties that are unique to a home 
} 

type BikeType struct { 
    Name     interface{}  `json:"name,omitempty"` 
    Description   interface{}  `json:"description,omitempty"` 
    Tires     interface{}  `json:"tires,omitempty"` 
    ... more properties that are unique to a bike 
} 

Lisez ici pour en savoir plus sur les interfaces vides - link

Hope this est ce que vous mENT