Go での Websocket の汎用 JSON シリアル化/逆シリアル化
Websocket を使用する場合、通信用に JSON データをシリアル化および逆シリアル化する必要がよくあります。クライアントとサーバーの間。一般的な課題の 1 つは、さまざまなフィールドを持つ構造体など、さまざまなタイプの受信メッセージを処理することです。
このシナリオでは、ゴリラ WebSocket と JSON を使用してシリアル化と逆シリアル化を行うため、各メッセージのタイプを明示的に指定するのが面倒な場合があります。 。 conn.ReadJSON() 関数では、特定の型を指定する必要がありますが、複数のメッセージ タイプを処理する場合には必ずしも実用的ではありません。
JSON コントロールを使用した一般的なソリューション
一般的な解決策には、メッセージ タイプを示す制御フィールドを含む構造体を定義することが含まれます。この制御フィールドを使用すると、プログラムは逆シリアル化に使用する特定のデータ構造を決定できます。
type Messages struct { Control string `json:"control"` X json.RawMessage }
このメッセージ構造体には、任意のタイプの JSON データを生のメッセージとして保持できる Control フィールドと X フィールドが含まれています。 .
メッセージの逆シリアル化と処理
メッセージ受信時conn.ReadJSON() を使用すると、データを Messages 構造体に保存できます。次に、Control フィールドを使用して、X フィールドに格納されているデータの実際のタイプを決定できます。
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 the Bar struct }
この例では、Control フィールドが「Foo」の場合、X フィールドは Foo に逆シリアル化されます。 json.Unmarshal() を使用した構造体。このプロセスは、他のメッセージ タイプに対して繰り返すことができます。
このアプローチの利点:
以上がGo Websocket で複数のメッセージ タイプの JSON シリアル化/逆シリアル化を処理する方法は?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。