首頁  >  文章  >  後端開發  >  如何在 Go 中將 JSON Websocket 訊息反序列化為聯合類型?

如何在 Go 中將 JSON Websocket 訊息反序列化為聯合類型?

Linda Hamilton
Linda Hamilton原創
2024-11-20 11:18:02520瀏覽

How to Deserialize JSON Websocket Messages as Union Types in Go?

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

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn