2 回答
TA贡献1884条经验 获得超4个赞
为什么不把它解析成 map[string]string 因为这段代码必须做
var d map[string]interface{}
data, err := json.Unmarshal(apiResponse, &d)
您也可以遍历此结构中的数据。
如果您怀疑,该 api 响应可以不是单一对象,而是对象的集合,interface{}也适用于数组。
TA贡献1863条经验 获得超2个赞
如果您不知道消息中的内容,则可能有几种情况。
取决于类型的消息内容
类型通常由某个类型字段指示。在这种情况下,您可以使用包含所有类型字段的“联合”结构:
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
}
将消息解组到联合结构中,按类型分派,然后选择子结构。
var m Message
json.Unmarshal(data, &m)
switch m.Type {
case "foo":
...
case "bar":
...
}
完全动态消息
在这种情况下,您有一组不相关的键值并单独处理它们。
解析为map[string]interface{}. 当然,缺点是您必须强制转换每个值并动态检查其类型。警告: map[string]interface{}将所有数字转换为浮点数,甚至是整数,因此您已将它们转换为float64.
map[string]json.RawMessage如果您不想解析值,也可以使用,只有键(json.RawMessage是 a []byte,并且在解组时保持原样)。
带有动态负载的“信封”消息
例如:
{
"type": "foo",
"payload": {
"key1": "value1"
}
}
{
"type": "bar",
"payload": {
"key2": "value2",
"key3": [1, 2]
}
}
将结构与json.RawMessage.
type Message struct {
Type string
Payload json.RawMessage
}
type Foo struct {
Key1 string
}
type Bar struct {
Key2 string
Key3 []int
}
解析信封(有效载荷将被保留),然后按类型分派,并将有效载荷解析为子结构。
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 关注
- 166 浏览
添加回答
举报