JSON と Go を使用した任意のデータのアンマーシャリング
特定の要件があります。それは、JSON データを処理できる方法でアンマーシャリングすることです。部品またはセクション。これを実現するには、データの前半、つまり「コード」が後半の解釈方法を示す構造を想定します。後半で考えられる 2 つの構造体は、Range と User です。
課題
Go の既存の json パッケージは、定義された構造体のマーシャリングとアンマーシャリングに便利な関数を提供しますが、任意のデータのニーズには対応しません。
ソリューションのデコード
この解決策には、メッセージ構造体に json.RawMessage フィールド (ペイロード) を導入することが含まれます。このフィールドを使用すると、前半で指定されたコードがわかるまでデータの解析を遅らせることができます。
Go での実装例は次のとおりです。
<code class="go">type Message struct { Code int Payload json.RawMessage } type Range struct { Start int End int } type User struct { ID int Pass int } // Custom unmarshalling function func MyUnmarshall(m []byte) { var message Message json.Unmarshal(m, &message) var payload interface{} switch message.Code { case 3: payload = new(User) case 4: payload = new(Range) } json.Unmarshal(message.Payload, payload) }</code>
使用法
この解決策を使用するには、まず json.Unmarshal 関数を使用して「上半分」をアンマーシャリングします。次に、「上半分」から取得したコードに基づいて、再度 json.Unmarshal 関数を使用して「下半分」をアンマーシャリングし、今回はターゲットの json.RawMessage オブジェクトを提供します。
例
<code class="go">json := []byte(`{"Code": 4, "Payload": {"Start": 1, "End": 10}}`) MyUnmarshall(json) // This will decode the data into a Range object</code>
考慮事項
この手法を使用すると、構造化された柔軟な方法で任意のデータのアンマーシャリングを処理できます。ただし、事前にコードを知っていることと、さまざまなコードに一致する構造体の存在を知ることに対する実行時の依存関係が生じます。
以上が動的コード駆動スキーマを使用して Go で任意の JSON データをアンマーシャルする方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。