我很难理解如何正确地将一些JSON数据解组到一个inteface类型的数组中,然后使用它。我试图使这个示例代码尽可能简单,以说明我遇到的问题。代码可以在游乐场上找到:https://play.golang.org/p/U85J_lBJ7Zr
输出如下所示:
[地图对象类型:椅子ID:1234品牌:蓝色公司地图ID:5678位置:厨房对象类型:桌子]{} 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
}
发布于 2018-06-06 08:56:05
我不确定这是否实用,因为这是您的场景的简化版本。但是,一种方法是将这两种对象类型组合为一个新的对象类型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)
}
打印:
蓝色公司
厨房
https://stackoverflow.com/questions/50710160
复制相似问题