如何在Golang中解封嵌套的JSON对象?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (1138)

他们都不来覆盖我的情况,因此我创建一个新的。

我有如下的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
}

请忽略我没有返回正确错误的事实。为了简单起见,我把它留下了。

扫码关注云+社区

领取腾讯云代金券