内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用
他们都不来覆盖我的情况,因此我创建一个新的。
我有如下的JSON:
{"foo":{ "bar": "1", "baz": "2" }, "more": "text"}
有没有一种方法来解组嵌套bar属性,并直接将其分配给struct属性而不创建嵌套结构?
我现在采用的解决方案如下:
type Foo struct {
More String `json:"more"`
Foo struct {
Bar string `json:"bar"`
Baz string `json:"baz"`
} `json:"foo"`
// FooBar string `json:"foo.bar"`
}
这是一个简化版本,请忽略冗长。正如你所看到的,我希望能够解析并赋值
// FooBar string `json:"foo.bar"`
我见过有人用地图,但那不是我的情况。我基本上不关心foo
(这是一个大对象)的内容,除了一些特定的元素。
这种情况下的正确方法是什么?我不是在寻找奇怪的黑客,因此,如果这是一条路,我很好。
有没有一种方法来解组嵌套bar属性,并直接将其分配给struct属性而不创建嵌套结构?
不,encoding / json不能用“> some> deep> childnode”来实现,就像encoding / xml一样。嵌套结构是要走的路。
像Volker提到的那样,嵌套结构是要走的路。但是如果你真的不想嵌套结构,你可以重写UnmarshalJSON函数。
http://play.golang.org/p/T0aZEDL0Nu
type A struct {
FooBar string // takes foo.bar
FooBaz string // takes foo.baz
More string `json:"more"`
}
func (a *A) UnmarshalJSON(b []byte) error {
var f interface{}
json.Unmarshal(b, &f)
m := f.(map[string]interface{})
foomap := m["foo"]
v := foomap.(map[string]interface{})
a.FooBar = v["bar"].(string)
a.FooBaz = v["baz"].(string)
return nil
}
请忽略我没有返回正确错误的事实。为了简单起见,我把它留下了。