2016-08-16 1 views
2

Je voudrais unmarshal struct Outer défini comme:JSON unmarshal struct embarqué

type Outer struct { 
    Inner 
    Num int 
} 

type Inner struct { 
    Data string 
} 
func (i *Inner) UnmarshalJSON(data []byte) error { 
    i.Data = string(data) 
    return nil 
} 

L'utilisation json.Unmarshal(data, &Outer{}) semble seulement utiliser Inner « s UnmarshalJSON et ne tient pas compte du champ Num: https://play.golang.org/p/WUBfzpheMl

J'ai un peu maniable solution où j'ai défini le champ Num manuellement, mais je me demandais si quelqu'un avait un moyen plus simple ou plus propre de le faire.

Merci!

Répondre

2

plus complet Cela se produit parce que Inner est noyé dans Outer. Cela signifie que lorsque la bibliothèque json appelle unmarshaler sur Outer, elle finit par l'appeler au Inner.

Par conséquent, à l'intérieur de func (i *Inner) UnmarshalJSON(data []byte), l'argument data contient la chaîne JSON entière, que vous traitez ensuite pour Inner uniquement.

Vous pouvez corriger ce problème en Inner champ explicite dans Outer

Outer struct { 
    I Inner // make Inner an explicit field 
    Num int `json:"Num"` 
} 

Working example

+0

Merci pour l'explication! – tochiai

0

Il suffit de supprimer UnmarshalJSON dans votre exemple, car il est utilisé dans unmarshaling de Outer depuis Inner est inline. Sinon, vous devez le remplacer si vous voulez faire quelque chose de personnalisé.

https://play.golang.org/p/D6V6vKpx9J