golang Unmarshalling websocket-rails JSON响应

时间:2015-03-27 08:13:25

标签: ruby-on-rails json go websocket

[
    [
        "client_connected",
         {
            "id": null,
            "channel": null,
            "user_id": null,
            "data": {
               "connection_id": null
            },
            "success": null,
            "result": null,
            "server_token": null
        }   
    ]
]

鉴于来自 websocket-rails 服务器的这个JSON响应,我想知道解析这个的最佳方法是什么,因为有一个没有任何密钥的字符串?

1 个答案:

答案 0 :(得分:1)

这不是最好的解决方案,但它是最简单的:

由于JSON输入不是方便的键值对(或其数组),我们不能只使用简单的struct(这是可取的)来对内容进行建模。

您的JSON输入是一个数组数组。在里面有混合类型,所有这些都可以存储在空接口interface{}中(可以保存任何类型的值)。

因此,您可以使用以下类型表示您的数据结构:

js := [][]interface{}{}

以下是解组并打印它的完整代码:

js := [][]interface{}{}
err := json.Unmarshal([]byte(input), &js)
if err != nil {
    panic(err)
}
fmt.Printf("%q", js)

输出(包裹):

[["client_connected" map["server_token":<nil> "id":<nil> "channel":<nil> 
  "user_id":<nil> "data":map["connection_id":<nil>] "success":<nil> "result":<nil>]]]

Go Playground上尝试。

备注:

看起来我们可以通过interface{}变量使用js类型来进一步简化它:

var js interface{}

它也有效,但在这种情况下,我们需要Type assertions甚至只需要找到“包装”数组的元素,这将是退一步。