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 サイトの他の関連記事を参照してください。