【问题标题】:Go unmarshal json with a field that is an array of objects or strings使用作为对象或字符串数​​组的字段解组 json
【发布时间】:2014-11-10 15:24:23
【问题描述】:

在 go 中,您将 json 解组为一个结构。问题是我有一个 api,它可能会在请求之间更改键值的类型。

例如可能是这样内联对象的对象:

{
  "mykey": [
    {obj1}, 
    {obj2}
  ]
}

但也可以通过键指向对象,像这样:

{
  "mykey": [
    "/obj1/is/at/this/path", 
    "/obj2/is/at/this/other/path"
  ]
}

有些对象可以内联,但有些对象可以从多个位置引用。

在 javascript 或 python 中,这不是问题。只需检查类型即可。

解组和解析这两个对象的惯用方式是什么?反射是唯一的方法吗?

【问题讨论】:

  • 你可以使用 Go 中的通用 JSON 解码能力,你会得到一个map[string]interface{},它可以保存所有可能的数据。

标签: json go


【解决方案1】:

您可以将此 JSON 解组为如下结构:

type Data struct {
    MyKey []interface{} `json:"mykey"`
}

如果 JSON 包含字符串,它们将被解码为数组中的字符串。如果 JSON 包含对象,它们将被解码为 map[string]interface{} 值。您可以使用type switch 区分两者。像这样的:

for i, v := range data.MyKey {
    switch x := v.(type) {
    case string:
        fmt.Println("Got a string: ", x)
    case map[string]interface{}:
        fmt.Printf("Got an object: %#v\n", x)
    }
}

你可以在这里玩这个例子:http://play.golang.org/p/PzwFI2FSav

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-24
    • 2016-07-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多