2016-08-16 2 views
2

Я хотел бы распаковать на структуру Outer определяется как:JSON распаковать встроенную структуру

type Outer struct { 
    Inner 
    Num int 
} 

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

Использования json.Unmarshal(data, &Outer{}) кажется только использовать Inner «s UnmarshalJSON и игнорирует Num поля: https://play.golang.org/p/WUBfzpheMl

У меня есть громоздкий solution, где я установил поле Num вручную, но мне было интересно, есть ли у кого-нибудь более чистый или простой способ сделать это.

Спасибо!

ответ

2

Это происходит потому, что Inner является встраивание в Outer. Это означает, что когда json-библиотека вызывает unmarshaler на Outer, вместо этого она вызывает ее на Inner.

Следовательно, внутри func (i *Inner) UnmarshalJSON(data []byte) аргумент data содержит всю строку json, которую вы затем обрабатываете только для Inner.

Вы можете это исправить, сделав Inner явное поле в Outer

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

Working example

+0

Спасибо за объяснение! – tochiai

0

Просто удалите UnmarshalJSON в вашем примере, так как он используется в демаршалинге из Outer так Inner является встраиваемым. В противном случае вам нужно переопределить его, если вы хотите сделать что-то обычай.

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

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