我想解组到结构Outer
定义为:
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
的UnmarshalJSON
并忽略Num
领域:https://play.golang.org/p/WUBfzpheMl
我有一个笨拙solution,我手动设置Num
领域,但我想知道是否有人有一个更清洁或更简单的方法来做到这一点。
谢谢!
这是发生,因为Inner
被嵌入在Outer
。这意味着,当JSON库的调用上Outer
unmarshaler,它不是结束调用它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"`
}
因为它在UnmarshalJSON
的拆封使用,因为Outer
内联在你的例子只是删除Inner
。否则,你需要,如果你想要做的事习俗覆盖它。
其实你并不需要明确的领域,你需要正确元帅/解组
例如:https://play.golang.org/p/mWPM7m44wfK
package main
import (
"encoding/json"
"fmt"
)
type Outer struct {
Inner
Num int `json:"Num"`
}
type Inner struct{ Data string }
type InnerRaw struct {Data string}
func (i *Inner) UnmarshalJSON(data []byte) error {
ir:=&InnerRaw{}
json.Unmarshal(data, ir)
i.Data = ir.Data
return nil
}
func main() {
x := Outer{}
data := []byte(`{"Num": 4, "Data":"234"}`)
_ = json.Unmarshal(data, &x)
fmt.Printf("%+v\n", x)
js, _:=json.Marshal(x)
fmt.Printf("JSON:%s", string(js))
}