7

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

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

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

{"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. 再次解析原始消息,这次解析到刚刚创建的结构中。

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

4

1 回答 1

5

我认为您的过程可能比它必须的要复杂一些,请参阅http://play.golang.org/p/0gahcMpuQc。一个 map[string]interface{} 将为您处理很多。

或者,您可以制作类似的类型

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

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

于 2013-04-14T12:37:38.947 回答