json - Golang 使用类型

标签 json go types websocket gorilla

问题

我需要一些帮助来处理 Golang 中的类型,我感到非常困惑。我正在尝试更改 Gorilla 的 websocket 聊天示例,我想传入 JSON 并相应地对其进行处理。我需要能够设置例如用户,并向 websocket 发送消息。

在当前的实现中,它所做的只是接收一个字符串,并通过将其广播给所有连接的客户端来中继回去。

例如,我希望能够如下设置一个数据结构并以不同的方式处理它。

传入用户将是:

{
  'type': "user",
  'value': "John Doe"
}

传入消息将是:

{
  'type': "message",
  'value': "Hi There, how are you?"
}

请引用以下代码: https://github.com/gorilla/websocket/blob/master/examples/chat/conn.go#L52

for {
    _, message, err := c.ws.ReadMessage()
    if err != nil {
        break
    }
    h.broadcast <- message
}

数据

所以上面的代码适用于单个字符串,因为服务器所做的只是将来自任何客户端的传入消息传递给所有客户端。但我希望能够保存用户,并将事件用户列表与新消息一起发送回客户端。

为此,在我看来,我需要以不同方式处理不同的传入消息。我试图取消传入的消息,但是当我打印出类型时,它是这样的:

2015/11/24 20:03:10 []uint8

问题

我如何着手读取这个输入流,并将其解码为 JSON?这是我添加到该部分的调试:

for {
    _, dataString, err := c.ws.ReadMessage()
    if err != nil {
        break
    }

    log.Println(reflect.TypeOf(dataString))

    var data MessageData
    err = json.Unmarshal(dataString, &data)
    log.Println(data.Type)
    log.Println(data.Value)

    if err != nil {
        log.Println(err)
    }

    h.broadcast <- dataString
}

哪个返回

2015/11/24 20:03:10 []uint8
2015/11/24 20:03:10 
2015/11/24 20:03:10 

最佳答案

对不起,我当时有点傻。 message 已经是一个字节类型的接口(interface)。在将数据发送到后端之前,我没有在 HTML/JavaScript 前端正确编码数据。

有效的方法是在前端将其字符串化:

var data = {};
data.type = "user";
data.value = user.val();
conn.send(JSON.stringify(data));
JSON.stringify(data)

然后我能够解码 JSON:

2015/11/24 20:36:04 {user fhgfhg}
2015/11/24 20:36:04 user
2015/11/24 20:36:04 fhgfhg

关于json - Golang 使用类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33901055/

相关文章:

json - 如何在名称为 'a%' 的 couchdb 中编写通配符搜索查询

c# - 将 JSON 对象包装在另一个对象中的正确方法是什么?

arrays - 如何在 Go 中保持强引用?

c# 数据类型 -> oracle 数据类型

编译时类型未知的 Java 类属性

javascript - 获取 JSON 文件

ios - 从 NSDictionary 获取信息

string - 调用带有特殊前缀/后缀的函数

ssh - 如何去除golang ssh客户端中的颜色代码

string - Error::description 被软弃用是否意味着我必须重写我当前的错误消息系统?