我有形式的一些JSON:有没有办法让json.Unmarshal()选择基于“type”属性的结构类型?
[{
"type": "car",
"color": "red",
"hp": 85,
"doors": 4
}, {
"type": "plane",
"color": "blue",
"engines": 3
}]
我有类型car
plane
和满足车辆接口;我希望能够写出:
var v []vehicle
e := json.Unmarshal(myJSON, &v)
......并让JSON用汽车和飞机填满我的车辆片;相反(并且不出所料)我只是得到“不能将对象解组成main类型的Go值”。
供参考,在这里所涉及的类型的合适的定义:
type vehicle interface {
vehicle()
}
type car struct {
Type string
Color string
HP int
Doors int
}
func (car) vehicle() { return }
type plane struct {
Type string
Color string
Engines int
}
func (plane) vehicle() { return }
var _ vehicle = (*car)(nil)
var _ vehicle = (*plane)(nil)
(请注意,我其实是在t
领域完全不感兴趣的car
和plane
- 它可以被省略,因为这个信息,如果有人成功回答这个问题,请隐藏在v
中的对象的动态类型中。)
有没有办法让JSON umarhsaller根据部分内容选择使用哪种类型(在这种情况下,数据类型字段)被解码?
(请注意,这是不的Unmarshal JSON with unknown fields重复的,因为我想在片每个项目有不同的动态类型,并从“类型”属性的值,我知道究竟期待哪些领域 - 我只是不知道如何告诉json.Unmarshal如何将'type'属性值映射到Go类型上。)
是的,你可以实现'json.Unamrshaler',但它取决于你希望你的最终数据结构的样子。你期望“车辆”是什么? – JimB
如问题所示,我希望我的最终数据结构'v'是'[] vehicle'(或'[] * vehicle'',这也可以)'v [0]'是一个'car'和'v [1]'是一架飞机。 – cpcallen
@JimB:你会如此重视这个问题吗?我相信我已经充分澄清,以证明它不是“完全重复的”[Unmarshal JSON with unknown fields](https:// stackoverflow。COM /问题/ 33436730 /解组JSON-与未知场)。 – cpcallen