json - 解码异构结构的 JSON 数组

标签 json go

我想反序列化一个包含某个接口(interface) Entity 数组的对象:

type Result struct {
    Foo int;
    Bar []Entity;
};

Entity 是由许多结构类型实现的接口(interface)。 JSON 数据在每个实体中使用“类型”字段标识结构类型。例如

{"type":"t1","field1":1}
{"type":"t2","field2":2,"field3":3}

我将如何以正确填充数组的方式反序列化 Result 类型。据我所知,我必须:

  1. Result 上实现 UnmarshalJSON
  2. Bar 解析为 []*json.RawMessage
  3. 将每条原始消息解析为 map[string]interface{}
  4. 检查原始消息中的“类型”字段。
  5. 创建一个适当类型的结构。
  6. 再次解析原始消息,这次是解析到刚刚创建的结构中。

这一切听起来非常乏味和乏味。有一个更好的方法吗?或者我是在倒退,还有更规范的方法来处理异构对象数组?

最佳答案

我认为您的流程可能比实际情况要复杂一些,请参阅 http://play.golang.org/p/0gahcMpuQc .单个 map[string]interface{} 将为您处理很多事情。

或者,你可以制作一个像这样的类型

struct EntityUnion {
    Type string
    // Fields from t1
    // Fields from t2
    // ...
}

解编成那个;它将设置类型字符串并填写它可以从 JSON 数据中获取的所有字段。然后你只需要一个小函数来将字段复制到特定类型。

关于json - 解码异构结构的 JSON 数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15996997/

相关文章:

jquery - JSON 选择数据

java - Gson - 简化某些字段的序列化

linux - 如何在 go 中正确实现挂载命名空间

go - 收到 EOF panic 错误

json - Go 的 .(type) 在解码 JSON 时做一些意外的事情

json - 在 Swift 中解码复杂的 JSON 对象

go - Go 中的文件权限掩码

go - 为什么在新计算机上访问 Firestore 时出现 ‘panic: runtime error: invalid memory address or nil pointer dereference’?

来自json的url中的php数组

sql - 如何在 Golang 中缓存到不同 Postgres/MySQL 数据库的连接?