首页 > 解决方案 > 反序列化“oneOf”结构的 Json 数组

问题描述

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

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

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

标签: jsongo

解决方案


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

一种方法是使用 type 的切片,[]interface{}encoding/json将选择类型本身来解组,这将map[string]interface{}用于 JSON 对象。

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

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]]}

推荐阅读