【问题标题】:Go Unmarshall json whose key can be one of 2 typesGo Unmarshal json,其键可以是两种类型之一
【发布时间】:2015-12-03 18:48:20
【问题描述】:

一个不在我控制范围内的 api 端点返回带有关键人员的 json,该关键人员可以具有 2 种类型之一。

json:

{
    "people":{
       "admin":{
           "Name": "John Smith",
           "Address": "123 main street"
        },
       "user":{
           "Name": "Jane Doe",
           "Address": "321 broad street",
       }
}

Json 类型 2:

{
    "people":[
        {
            "name": "Jon Snow",
            "pet": "Ghost"
        },
        {
            "name": "Sansa Stark",
            "pet": "Lady",
        }
    ]
}

对于第一种类型,我可以这样创建结构

type People struct {
   Admin *Person `json:"admin,omitempty"`
   User  *Person `json:"user,omitempty"`
}

type Person struct {
   Name string `json:"name,omitempty"`
   Address string `json:"adress,omitempty"`
}

或者第二种是

type People []*Person
type Person struct{
    Name string `json:"name,omitempty"`
    Pet  string `json:"pet,omitempty"`
}

有没有办法设计一个结构,以便我可以解组任何类型的响应?

【问题讨论】:

  • 你当然可以,但只尝试一种类型可能会容易得多,如果失败了尝试另一种。其他几件小事值得一提; 1) 你绝对可以有一个带有NameAddressPetPerson 定义,2) 你的第一个json sn-p 是一个没有有效的右括号。 3) 在这两种情况下,您在此处发布的模型中都没有考虑到一个外部对象(即,它是一个包含名为 people 的数组的对象,该数组具有 person 类型的对象,而不是具有 person 类型的对象的数组) .
  • 更简单可能不正确。为了做得好,你仍然需要编写一些代码,我只是认为它更容易推理。我建议在你解组的包中公开一个类型或接口,同时隐藏你使用的实际类型。您公开的内容应该由对消费者更直观的内容决定。就像数组响应中可能有超过 2 个人一样,我可能只返回一个数组。也许我会添加一个Role 字段并在响应为第一种形式时分配"admin""user"。如果它始终是管理员和用户,我只会返回第一种类型。

标签: json go


【解决方案1】:

我会将people 解码为映射,然后进行类型断言以确定它是数组还是对象。

【讨论】:

    猜你喜欢
    • 2020-01-27
    • 2021-12-19
    • 1970-01-01
    • 2015-10-28
    • 1970-01-01
    • 2014-08-30
    • 1970-01-01
    • 2018-06-04
    • 1970-01-01
    相关资源
    最近更新 更多