ホームページ > バックエンド開発 > Golang > Go Websocket で複数のメッセージ タイプの JSON シリアル化/逆シリアル化を処理する方法は?

Go Websocket で複数のメッセージ タイプの JSON シリアル化/逆シリアル化を処理する方法は?

Linda Hamilton
リリース: 2024-11-15 09:14:02
オリジナル
731 人が閲覧しました

How to Handle JSON Serialization/Deserialization for Multiple Message Types in Go Websockets?

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

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート