我有形式的一些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