动态的揭露
#编程 #go #性能 #websocket

在此博客中,我将帮助您理解一个动态杂物的独特问题,我在哪里遇到了它,以及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进行我们的救援!

在服务器上,让我们创建一个包装器结构,并介绍称为MessageType的其他属性,而实际消息则为诸如“ content”

之类的通用内容

WebSocket_server.go

    type MessageWrapper struct {
        MessageType   string `json:"message_type"`
        MessageType_A `json:"content"`
    }

创建一个实例并填充它。元帅并将其写入Websocket连接:

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

如果您在软件包内部看,则本质上是字节数组的类型别名。因为那是表示数据的最基本形式!请参阅库代码:https://github.com/golang/go/blob/master/src/encoding/json/stream.go#L255

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 {...}

这样做,Unmarshaler仅填充了MessageType字段。你不相信我吗? ðÖ

让我们看一下演示:ð»

WebSocket服务器:
websocket server starting

WebSocket客户端:
websocket client starting

WebSocket服务器从客户端接收到并发送消息

server sent back the message of type A

在客户端端,发布Unmarshalling-您可以看到消息类型,但实际是字节和原始!

type printed, but content is still printed as byte representation

,您可以根据消息类型愉快地推迟删除消息的其余部分! ðρ

unmarshalling to actual struct

那么,简而言之,什么时候使用json.rawmessage?

  1. 当您想忽略JSON的某些部分

    • 我为什么要这样做? - 你问。 好吧,假设在上面的Websocket连接中,服务器需要发送静止数据包。 在这种情况下,只知道消息类型应达到目的。
  2. 当您想明确控制数据时,直到您根据某些条件进行分支

    进行分支<
    • 我们看到了上述用例以在这里匹配。

在此处参考GitHub Gist:

https://gist.github.com/PankhudiB/e06c56bcd65c329e6996b611d118f7ed

希望此博客能帮助您了解JSON.RAWMESSAGE的惊人!在评论中让我知道您是否有任何疑问或反馈!愉快的编码! ð©ð»