解组嵌套的 JSON 对象

新手上路,请多包涵

关于这个 主题 几个 问题,但似乎没有一个能涵盖我的情况,因此我正在创建一个新问题。

我有如下 JSON:

 {"foo":{ "bar": "1", "baz": "2" }, "more": "text"}

有没有办法解组嵌套的 bar 属性并将其直接分配给结构属性而不创建嵌套结构?

我现在采用的解决方案如下:

 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 (这是一个大对象)的内容,除了一些特定的元素。

在这种情况下正确的方法是什么?我不是在寻找奇怪的 hack,因此如果这是要走的路,我很好。

原文由 Simone Carletti 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 494
2 个回答

有没有办法解组嵌套的 bar 属性并将其直接分配给结构属性而不创建嵌套结构?

不,encoding/json 不能像 encoding/xml 那样用“>some>deep>childnode”来解决问题。嵌套结构是要走的路。

原文由 Volker 发布,翻译遵循 CC BY-SA 3.0 许可协议

就像 Volker 提到的那样,嵌套结构是可行的方法。但是如果你 真的 不想要嵌套结构,你可以覆盖 UnmarshalJSON func。

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

 type A struct {
    FooBar string // takes foo.bar
    FooBaz string // takes foo.baz
    More   string
}

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)
    a.More = m["more"].(string)

    return nil
}

请忽略我没有返回正确错误的事实。为简单起见,我将其排除在外。

更新:正确检索“更多”值。

原文由 rexposadas 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题