ホームページ  >  記事  >  バックエンド開発  >  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 では、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
}

制御フィールドはペイロードのタイプを示します。 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 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。