首頁 > 後端開發 > Golang > 如何在 Go Websockets 中處理多種訊息類型的 JSON 序列化/反序列化?

如何在 Go Websockets 中處理多種訊息類型的 JSON 序列化/反序列化?

Linda Hamilton
發布: 2024-11-15 09:14:02
原創
716 人瀏覽過

How to Handle JSON Serialization/Deserialization for Multiple Message Types in Go Websockets?

Go 中Websocket 的通用JSON 序列化/反序列化

使用Websocket 時,經常需要序列化和反序列化JSON以進行通訊客戶端和伺服器之間。一個常見的挑戰是處理不同類型的傳入訊息,例如具有不同欄位的結構。

在這種情況下,使用 gorilla websocket 和 JSON 進行序列化和反序列化,明確指定每個訊息的類型可能很麻煩。 conn.ReadJSON() 函數需要提供特定類型,這在處理多種訊息類型時並不總是實用。

使用 JSON 控制項的通用解決方案

通用解決方案涉及定義一個包含指示訊息類型的控製字段的結構。此控製字段允許程式確定用於反序列化的特定資料結構。

type Messages struct {
    Control string `json:"control"`
    X       json.RawMessage
}
登入後複製

此Messages 結構包括一個Control 字段和一個X 字段,它可以將任何類型的JSON 資料作為原始訊息保存.

反序列化和處理訊息

使用conn.ReadJSON() 接收訊息時,資料可以儲存在Messages 結構中。然後,Control 欄位可用於確定 X 欄位中儲存的資料的實際類型。

var m Messages
err := c.ReadJSON(&m)
if err != nil {
    // handle error
}
switch m.Control {
case "Foo":
    var foo Foo
    if err := json.Unmarshal([]byte(m.X), &foo); err != nil {
        // handle error
    }
    // do something with foo
case "Bar":
    // follow the same pattern for the Bar struct
}
登入後複製

在此範例中,如果 Control 欄位為“Foo”,則 X 欄位將反序列化為 Foo使用 json.Unmarshal() 建構。對於其他訊息類型可以重複此過程。

此方法的優點:

  • 允許一般處理多種類型的消息。
  • 簡化了讀取和處理訊息的過程。
  • 透過將訊息類型處理與通訊邏輯解耦來提高程式碼可維護性。

以上是如何在 Go Websockets 中處理多種訊息類型的 JSON 序列化/反序列化?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板