我想反序列化一个包含某个接口(interface) Entity
数组的对象:
type Result struct {
Foo int;
Bar []Entity;
};
Entity
是由许多结构类型实现的接口(interface)。 JSON 数据在每个实体中使用“类型”字段标识结构类型。例如
{"type":"t1","field1":1}
{"type":"t2","field2":2,"field3":3}
我将如何以正确填充数组的方式反序列化 Result
类型。据我所知,我必须:
- 在
Result
上实现UnmarshalJSON
。 - 将
Bar
解析为[]*json.RawMessage
。 - 将每条原始消息解析为
map[string]interface{}
。 - 检查原始消息中的“类型”字段。
- 创建一个适当类型的结构。
- 再次解析原始消息,这次是解析到刚刚创建的结构中。
这一切听起来非常乏味和乏味。有一个更好的方法吗?或者我是在倒退,还有更规范的方法来处理异构对象数组?
最佳答案
我认为您的流程可能比实际情况要复杂一些,请参阅 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/