在Go 中將JSON Websocket 訊息反序列化為聯合類型
在Go 中,gorilla websocket 庫通常用於處理websocket 連接。但是,當使用 JSON 進行序列化和反序列化時,處理不同類型的傳入訊息會帶來挑戰。
考慮以下範例,其中您有訊息類型「Foo」和「Bar」的結構:
type Foo struct { A string `json:"a"` B string `json:"b"` } type Bar struct { C string `json:"c"` D string `json:"d"` }
Gorilla 的conn.ReadJSON 函數可讓您將傳入的JSON 訊息反序列化為特定的結構。但是,您需要使用單獨的 conn.ReadJSON(Foo) 和 conn.ReadJSON(Bar) 呼叫來處理不同類型的訊息,這是低效且麻煩的。
為了解決這個問題,您可以使用中介包含控製字段和保存實際消息資料的字段的結構體:
type Messages struct { Control string `json:"control"` X json.RawMessage }
Control 字段指示有效負載的類型,X 保存原始JSON數據。若要使用此方法反序列化傳入訊息:
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 handling Bar }
此解決方案可讓您使用 json.RawMessage 中的 RawMessage 介面類型來反序列化傳入訊息,無論其類型為何。 switch 語句檢查控製欄位以確定實際的訊息類型並相應地反序列化。
以上是如何在 Go 中將 JSON Websocket 訊息反序列化為聯合類型?的詳細內容。更多資訊請關注PHP中文網其他相關文章!