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中文網其他相關文章!