为了账号安全,请及时绑定邮箱和手机立即绑定

Golang:来自 URL 的 Json 作为地图

Golang:来自 URL 的 Json 作为地图

Go
明月笑刀无情 2021-10-18 16:52:11
从 url 中提取 json 的最佳方法是什么,即来自 Go 的 Rest 服务?此外,似乎大多数其余客户端库都强制使用 json.marshall ,它需要一个与之一起使用的结构。这在非结构化数据的情况下不起作用,您不完全知道将要输入什么。有没有办法让它全部作为地图 [string:string] 输入?
查看完整描述

2 回答

?
慕村9548890

TA贡献1884条经验 获得超4个赞

为什么不把它解析成 map[string]string 因为这段代码必须做


var d map[string]interface{}

data, err := json.Unmarshal(apiResponse, &d)

您也可以遍历此结构中的数据。


如果您怀疑,该 api 响应可以不是单一对象,而是对象的集合,interface{}也适用于数组。


查看完整回答
反对 回复 2021-10-18
?
小唯快跑啊

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

}


查看完整回答
反对 回复 2021-10-18
  • 2 回答
  • 0 关注
  • 166 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信