非同種の JSON データのアンマーシャリング
この調査は、特定のセクションの選択的なアンマーシャリングを可能にするメカニズムを活用して、JSON データを効率的にアンマーシャリングすることに焦点を当てています。またはセグメント。目的は、最初の部分が後の部分に含まれるデータのタイプを決定する「コード」として機能する JSON 構造を処理することです。
複数のデータ構造があるシナリオを想像してください:
<code class="go">type Range struct { Start int End int } type User struct { ID int Pass int }</code>
そして、JSON メッセージには、「ペイロード」フィールドにどのようなデータがあるかを示す「コード」フィールドがあります。
<code class="json">{ "Code": 4, "Payload": { "Start": 1, "End": 10 } } { "Code": 3, "Payload": { "ID": 1, "Pass": 1234 } }</code>
「ペイロード」フィールドを、ベースの適切なデータ構造にアンマーシャリングする必要があります。
解決策
ここで重要なのは、json.RawMessage タイプを使用して、「ペイロード」フィールドのアンマーシャリングを遅延させることです。その種類を知っています。例:
<code class="go">package main import ( "encoding/json" "fmt" ) type Message struct { Code int Payload json.RawMessage // Delay parsing until we know the code } // Unmarshall into appropriate structures based on Code func unmarshal(m []byte) error { var message Message err := json.Unmarshal(m, &message) if err != nil { return err } switch message.Code { case 3: var user User if err := json.Unmarshal(message.Payload, &user); err != nil { return err } fmt.Printf("Unmarshalled a User: %#v\n", user) case 4: var range Range if err := json.Unmarshal(message.Payload, &range); err != nil { return err } fmt.Printf("Unmarshalled a Range: %#v\n", range) default: return fmt.Errorf("unknown code: %d", message.Code) } return nil } func main() { json1 := []byte(`{"Code": 3, "Payload": {"ID": 1, "Pass": 1234}}`) if err := unmarshal(json1); err != nil { fmt.Printf("error: %v\n", err) } json2 := []byte(`{"Code": 4, "Payload": {"Start": 1, "End": 10}}`) if err := unmarshal(json2); err != nil { fmt.Printf("error: %v\n", err) } }</code>
以上が「コード」フィールドを使用して同種でない JSON データをアンマーシャリングするにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。