任意のデータのアンマーシャリング
多くのシナリオでは、アンマーシャリング プロセスがさまざまな環境に適応できるように、柔軟な方法で JSON データをアンマーシャリングする必要があります。所定のコード値に基づくデータ構造。これにより、さまざまなソースから受信したデータを動的に解釈できるようになります。
たとえば、「ペイロード」フィールドに含まれるデータのタイプを指定する「コード」フィールドを含む JSON メッセージを考えてみましょう。 「ペイロード」フィールドは、「コード」値に応じて異なるデータ構造を表すことができます。
これを実現するには、次の手法を使用できます。
<code class="go">package main import ( "encoding/json" "fmt" ) type Message struct { Code int Payload json.RawMessage // delay parsing until we know the code } // Define the possible data structures that can be unmarshalled from the "payload" field type Range struct { Start int End int } type User struct { ID int Pass int } // Custom unmarshalling function func MyUnmarshall(m []byte) { var message Message var payload interface{} json.Unmarshal(m, &message) // delay parsing until we know the color space // Determine the data structure based on the "code" field switch message.Code { case 3: payload = new(User) case 4: payload = new(Range) } // Unmarshall the "payload" field into the appropriate data structure json.Unmarshal(message.Payload, payload) //err check ommited for readability // Do something with the unmarshalled data fmt.Printf("\n%v%+v", message.Code, payload) } func main() { json := []byte(`{"Code": 4, "Payload": {"Start": 1, "End": 10}}`) MyUnmarshall(json) json = []byte(`{"Code": 3, "Payload": {"ID": 1, "Pass": 1234}}`) MyUnmarshall(json) }</code>
この例では、 MyUnmarshall 関数は、JSON メッセージを受信し、「コード」フィールドと「ペイロード」フィールドをメッセージ構造体に保存し、「コード」値に基づいてデータ構造インスタンスを動的に作成します。その後、「ペイロード」フィールドを適切な構造にアンマーシャリングし、アンマーシャリングされたデータに対して必要なアクションを実行します。
以上がコード値に基づいて JSON データを動的にアンマーシャリングする方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。