json - 反序列化 "oneOf"结构的 Json 数组

标签 json go

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

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

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

最佳答案

Go(目前)还没有泛型支持,因此您无法创建一个数组来表示来自 JSON 的不同类型的值。

一种方法是使用 []interface{} 类型的 slice ,以及 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]]}

关于json - 反序列化 "oneOf"结构的 Json 数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54455223/

相关文章:

javascript - 将原始 json 数组生成到 ASP.NET MVC 中的 View 中

google-app-engine - 如何在 Go AppEngine 中将数据存储查询存储到内存缓存?

go - 扇出,多播,接收者数量未知

go - 如何在 Go 中使用 reflect 获取 map 接口(interface)的值?

javascript - 我如何从 JSON Google map 获取纬度和经度坐标

ios - 将 JSON 数组附加到数组中的值

php - 在 <script> 标签中使用 PHP?

go - 无法按键获取 gorilla session 值

go - Go 中 Prometheus 的多个端点

c++ - Qt、QVariant、JSON 和枚举