ホームページ >バックエンド開発 >Golang >Gorilla Websocket を使用して Go WebSocket で混合 JSON メッセージ タイプを処理する方法

Gorilla Websocket を使用して Go WebSocket で混合 JSON メッセージ タイプを処理する方法

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2024-11-14 19:40:03420ブラウズ

How to Handle Mixed JSON Message Types in Go WebSocket using Gorilla Websocket?

Go WebSocket JSON シリアル化/逆シリアル化: 混合受信メッセージの処理

Go では、WebSocket 通信にゴリラ WebSocket パッケージを使用し、受信メッセージを処理しますタイプが混在していると、課題が生じる可能性があります。ライブラリの conn.ReadJSON 関数は、単一の構造体型への逆シリアル化に制限されています。

問題ステートメント

受信メッセージの型を表す 2 つの構造体 Foo と Bar を考えてみましょう。

type Foo struct {
    A string `json:"a"`
    B string `json:"b"`
}

type Bar struct {
    C string `json:"c"`
    D string `json:"d"`
}

要件は、これらの受信メッセージを処理し、そのタイプ (Foo または Bar) を識別し、それに応じて適切な構造体に逆シリアル化することです。

解決策

混合受信メッセージを処理するには、次のアプローチを使用できます。

1.ラッパー構造体の使用:

メッセージ タイプを指定する Control フィールドと逆シリアル化されたデータを保持する X フィールドを含むラッパー構造体 Messages を作成します。

type Messages struct {
    Control string `json:"control"`
    X json.RawMessage
}

2. Wrapper 構造体への ReadJSON:

conn.ReadJSON を使用して、受信メッセージを Messages 構造体に逆シリアル化します。

var m Messages
err := c.ReadJSON(&m)
if err != nil {
    // handle error
}

3.メッセージ タイプを解析します:

m.Control の値に基づいて、実際のメッセージ タイプ (Foo または Bar) を決定します。

switch m.Control {
case "Foo":
    // Convert the JSON to a Foo struct
case "Bar":
    // Convert the JSON to a Bar struct
}

コード例:

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 pattern for Foo
}

Messages 構造体で json.RawMessage を使用すると、逆シリアル化されたデータをメッセージ タイプに基づいて動的に処理できます。このソリューションにより、さまざまな構造の受信メッセージを柔軟に処理できます。

以上がGorilla Websocket を使用して Go WebSocket で混合 JSON メッセージ タイプを処理する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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