2016-08-16 104 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{})似乎只用InnerUnmarshalJSON并忽略Num领域:https://play.golang.org/p/WUBfzpheMl

我有一个笨拙solution其中我手动设置了Num字段,但我想知道是否有人用更简单或更简单的方法来完成此操作。

谢谢!

回答

2

这是发生,因为Inner被嵌入在Outer。这意味着当json库在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