反序列化“ oneOf”结构的Json数组

时间:2019-01-31 07:16:05

标签: json go

我有JSON文档,其中包含一个数组,其中每个项目都是字符串或表示对象的映射。

{"oneOfArray": ["str1", "str2", {"SomeStruct": "value3"}, "str4", {"SomeStruct": "value5"} ]}

如何创建代表这种结构的Go类并通过json包提供反序列化?

1 个答案:

答案 0 :(得分:1)

Go尚无通用支持(因此),因此您无法创建一个数组来表示来自JSON的不同类型的值。

一种方法是使用类型为[]interface{}的切片,并且encoding/json包将选择要自己编组的类型,对于JSON对象,其类型为map[string]interface{}

您可以使用以下类型对外部对象进行建模:

type Obj struct {
    OneOfArray []interface{} `json:"oneOfArray"`
}

解组输入内容的示例:

src := `{"oneOfArray": ["str1", "str2", {"SomeStruct": "value3"}, "str4", {"SomeStruct": "value5"} ]}`

var obj Obj

if err := json.Unmarshal([]byte(src), &obj); err != nil {
    panic(err)
}
fmt.Println(obj)

输出(在Go Playground上尝试):

{[str1 str2 map[SomeStruct:value3] str4 map[SomeStruct:value5]]}