猿问

Golang:来自 URL 的 Json 作为地图

从 url 中提取 json 的最佳方法是什么,即来自 Go 的 Rest 服务?此外,似乎大多数其余客户端库都强制使用 json.marshall ,它需要一个与之一起使用的结构。

这在非结构化数据的情况下不起作用,您不完全知道将要输入什么。有没有办法让它全部作为地图 [string:string] 输入?


明月笑刀无情
浏览 165回答 2
2回答

慕村9548890

为什么不把它解析成 map[string]string 因为这段代码必须做var d map[string]interface{}data, err := json.Unmarshal(apiResponse, &d)您也可以遍历此结构中的数据。如果您怀疑,该 api 响应可以不是单一对象,而是对象的集合,interface{}也适用于数组。

小唯快跑啊

如果您不知道消息中的内容,则可能有几种情况。取决于类型的消息内容类型通常由某个类型字段指示。在这种情况下,您可以使用包含所有类型字段的“联合”结构: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 fieldstype Message struct {    Type string    A int    B string    C int    D string}将消息解组到联合结构中,按类型分派,然后选择子结构。var m Messagejson.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}
随时随地看视频慕课网APP

相关分类

Go
我要回答