2 回答

TA貢獻(xiàn)1884條經(jīng)驗 獲得超4個贊
為什么不把它解析成 map[string]string 因為這段代碼必須做
var d map[string]interface{}
data, err := json.Unmarshal(apiResponse, &d)
您也可以遍歷此結(jié)構(gòu)中的數(shù)據(jù)。
如果您懷疑,該 api 響應(yīng)可以不是單一對象,而是對象的集合,interface{}也適用于數(shù)組。

TA貢獻(xiàn)1863條經(jīng)驗 獲得超2個贊
如果您不知道消息中的內(nèi)容,則可能有幾種情況。
取決于類型的消息內(nèi)容
類型通常由某個類型字段指示。在這種情況下,您可以使用包含所有類型字段的“聯(lián)合”結(jié)構(gòu):
type Foo struct {
A int
B string
}
type Bar struct {
C int
D string
}
type Message struct {
Type string
Foo
Bar
}
// or this, if you have common fields
type Message struct {
Type string
A int
B string
C int
D string
}
將消息解組到聯(lián)合結(jié)構(gòu)中,按類型分派,然后選擇子結(jié)構(gòu)。
var m Message
json.Unmarshal(data, &m)
switch m.Type {
case "foo":
...
case "bar":
...
}
完全動態(tài)消息
在這種情況下,您有一組不相關(guān)的鍵值并單獨處理它們。
解析為map[string]interface{}. 當(dāng)然,缺點是您必須強(qiáng)制轉(zhuǎn)換每個值并動態(tài)檢查其類型。警告: map[string]interface{}將所有數(shù)字轉(zhuǎn)換為浮點數(shù),甚至是整數(shù),因此您已將它們轉(zhuǎn)換為float64.
map[string]json.RawMessage如果您不想解析值,也可以使用,只有鍵(json.RawMessage是 a []byte,并且在解組時保持原樣)。
帶有動態(tài)負(fù)載的“信封”消息
例如:
{
"type": "foo",
"payload": {
"key1": "value1"
}
}
{
"type": "bar",
"payload": {
"key2": "value2",
"key3": [1, 2]
}
}
將結(jié)構(gòu)與json.RawMessage.
type Message struct {
Type string
Payload json.RawMessage
}
type Foo struct {
Key1 string
}
type Bar struct {
Key2 string
Key3 []int
}
解析信封(有效載荷將被保留),然后按類型分派,并將有效載荷解析為子結(jié)構(gòu)。
var m Message
_ = json.Unmarshal(data, &m)
switch m.Type {
case "foo":
var payload Foo
_ = json.Unmarshal(m.Payload, &payload)
// do stuff
case "bar":
var payload Bar
_ = json.Unmarshal(m.Payload, &payload)
// do stuff
}
- 2 回答
- 0 關(guān)注
- 195 瀏覽
添加回答
舉報