解组异构结构的JSON数组

时间:2013-04-14 08:07:32

标签: json go

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

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

Entity是一个由许多结构类型实现的接口。 JSON数据标识每个实体中具有“类型”字段的结构类型。 E.g。

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

我如何以正确填充数组的方式对Result类型进行反序列化。从我所看到的,我必须:

  1. UnmarshalJSON上实施Result
  2. Bar解析为[]*json.RawMessage
  3. 将每条原始邮件解析为map[string]interface{}
  4. 检查原始邮件中的“类型”字段。
  5. 创建适当类型的结构。
  6. 再次解析原始消息 ,这次是刚刚创建的struct。
  7. 这听起来非常单调乏味。有一个更好的方法吗?或者我是否向后做,并且有一种更规范的方法来处理异构对象的数组?

1 个答案:

答案 0 :(得分:5)

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

或者,您可以创建类似

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

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