在此博客中,我将帮助您理解一个动态杂物的独特问题,我在哪里遇到了它,以及json.rawmessage如何帮助我们进行导航。
因此,我们都对HTTP端点非常熟悉。客户的消费逻辑很简单,因为您有单独的端点可用于单独的资源。
当您在WebSocket world时,您将在同一WebSocket连接上发送并接收各种不同的消息。
而且,当您这样做时,您经常会遇到独特的问题,即智能应对这些信息。因为您可能最终每次都可以完全挑选所有消息!!! ðÖ
那很丑! ðÖ
假设作为Websocket服务器,我们要发送2种邮件:
type MessageType_A struct {
Name string `json:"name"`
Place string `json:"place"`
}
type MessageType_B struct {
Animal string `json:"animal"`
Thing string `json:"thing"`
}
要发送这些消息,您需要将这些结构纳入这些结构
并在WebSocket连接上写下这些字节。
代码看起来像:
WebSocket_server.go --- 1.0
messageA := MessageTypeA { Name: "Pankhudi", Place: "India"}
// OR
messageB := MessageTypeB { Animal: "dog", Thing: "cap"}
bytes, err := json.Marshal(messageA) // OR messageB
err = websocketConn.WriteMessage(websocket.TextMessage, bytes)
现在,Websocket客户端的审理逻辑事先不知道它将接收到哪种类型的消息。您需要以某种方式知道要初始化哪个结构并将字节分开。
WebSocket_client.go --- 1.0
bytes, _, err := websocketConn.Read()
if err != nil {...}
messageA := MessageTypeA{}
// OR
messageB := MessageTypeB{}
json.Unmarshal(dataBytes, &messageA)
OR
json.Unmarshal(dataBytes, &messageA)
我怎么知道哪一个要删除它???
json.rawmessage进行我们的救援!
在服务器上,让我们创建一个包装器结构,并介绍称为 创建一个实例并填充它。元帅并将其写入Websocket连接: 如果您在软件包内部看,则本质上是字节数组的类型别名。因为那是表示数据的最基本形式!请参阅库代码:https://github.com/golang/go/blob/master/src/encoding/json/stream.go#L255 现在,当您将接收的字节列入包装器结构时: 这样做,Unmarshaler仅填充了MessageType字段。你不相信我吗? ðÖ WebSocket服务器从客户端接收到并发送消息 在客户端端,发布Unmarshalling-您可以看到消息类型,但实际是字节和原始! ,您可以根据消息类型愉快地推迟删除消息的其余部分! ðρ 当您想忽略JSON的某些部分 当您想明确控制数据时,直到您根据某些条件进行分支 https://gist.github.com/PankhudiB/e06c56bcd65c329e6996b611d118f7ed 希望此博客能帮助您了解JSON.RAWMESSAGE的惊人!在评论中让我知道您是否有任何疑问或反馈!愉快的编码! ð©ð»MessageType
的其他属性,而实际消息则为诸如“ content”
WebSocket_server.go
type MessageWrapper struct {
MessageType string `json:"message_type"`
MessageType_A `json:"content"`
}
WebSocket_server.go --- 2.0
messageA := MessageWrapper{
MessageType: "A",
MessageType_A: MessageType_A{Name: "Pankhudi", Place: "India"}
}
bytes, err := json.Marshal(messageA)
err = websocketConn.WriteMessage(websocket.TextMessage, bytes)
if err != nil {...}
在客户端,使用json.rawmessage
WebSocket_client.go --- 2.0
type MessageWrapper struct {
MessageType string `json:"message_type"`
Content json.RawMessage `json:"content"`
}
dataBytes, _, err := wsutil.ReadServerData(conn)
if err != nil {...}
messageWrapper := MessageWrapper{}
err = json.Unmarshal(dataBytes, &messageWrapper)
if err != nil {...}
让我们看一下演示:ð»
那么,简而言之,什么时候使用json.rawmessage?
在此处参考GitHub Gist: