如何将JSON解编组到接口数组并使用?

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

  • 回答 (1)
  • 关注 (0)
  • 查看 (36)

我很难理解如何正确解组进入类型接口数组然后使用它的一些JSON数据。我试图让这个示例代码尽可能简单,以说明我遇到的问题。代码可以在这里找到:

https//play.golang.org/p/U85J_lBJ7Zr

输出结果如下:

[map[ObjectType:chair ID:1234 Brand:Blue Inc.] map[ID:5678 Location:Kitchen ObjectType:table]] { } false { } false

代码:

package main

import (
    "fmt"
    "encoding/json"
)

type Chair struct {
    ObjectType string
    ID string
    Brand string
}

type Table struct {
    ObjectType string
    ID string
    Location string
}

type House struct {
    Name string
    Objects []interface{}
}



func main() {
    var h House
    data := returnJSONBlob()
    err := json.Unmarshal(data, &h)
    if err != nil {
       fmt.Println(err)
    }
    fmt.Println(h.Objects)
    s1, ok := h.Objects[0].(Table)
    fmt.Println(s1, ok)
    s2, ok := h.Objects[0].(Chair)
    fmt.Println(s2, ok)

}

func returnJSONBlob() []byte {
    s := []byte(`
{
  "Name": "house1",
  "Objects": [
    {
      "ObjectType": "chair",
      "ID": "1234",
      "Brand": "Blue Inc."
    },
    {
      "ObjectType": "table",
      "ID": "5678",
      "Location": "Kitchen"
    }
  ]
}
    `)
    return s
}
提问于
用户回答回答于

我不确定这是否实用,因为这是你的方案的简化版本。一种方法是将两个对象类型组合成一个新对象Object,然后直接解组它们Object而不是使用interface{}

package main

import (
    "encoding/json"
    "fmt"
)

type Object struct {
    ObjectType string
    ID         string
    Brand      string
    Location   string
}

type House struct {
    Name    string
    Objects []Object
}

func returnJSONBlob() []byte {
    s := []byte(`
{
  "Name": "house1",
  "Objects": [
    {
      "ObjectType": "chair",
      "ID": "1234",
      "Brand": "Blue Inc."
    },
    {
      "ObjectType": "table",
      "ID": "5678",
      "Location": "Kitchen"
    }
  ]
}
    `)
    return s
}

func main() {
    var h House
    data := returnJSONBlob()
    err := json.Unmarshal(data, &h)
    if err != nil {
        fmt.Println(err)
    }
    fmt.Println(h.Objects[0].Brand)
    fmt.Println(h.Objects[1].Location)

}

输出

Blue Inc.

Kitchen

例子:https://play.golang.org/p/91F4UrQlSjJ

扫码关注云+社区

领取腾讯云代金券