Go でダブルアンマーシャリングを行わずに JSON を解析する
Go では、二重アンマーシャリングを行わずにさまざまな型の JSON データを解析したい状況に遭遇することがあります。アンマーシャリングを 2 回実行します。関連する手順を見てみましょう:
ステップ 1: 汎用マップにアンマーシャリングする
前述したように、最初のステップは、JSON を汎用マップにアンマーシャリングすることです。 ]インタフェース{}。これにより、キーが文字列、値がさまざまなデータ構造を保持できる動的インターフェース タイプであるマップのような構造が提供されます。
ステップ 2: キーと値のタイプを特定する
マップを取得したら、それを繰り返し処理して、目的のキーを見つけます。値のタイプに応じて、次のステップに進むことができます。
ステップ 3: 既知の型を直接処理する
値の型が既知の構造体の場合は、それを直接キャストして、目的の構造体として使用できます。たとえば、Ping 構造体がある場合、マップ値が Ping にキャスト可能かどうかを確認できます。これは、JSON フィールド名が構造体フィールド名と一致し、データ型に互換性がある場合にうまく機能します。
ステップ 4: 不明な型に対する代替アプローチ
値の型が不明であるか、事前定義された構造体と互換性がない場合は、次の方法を使用できます。アプローチ:
部分的に改善アンマーシャリング
二重アンマーシャリングの必要性を回避するには、interface{} の代わりに値を json.RawMessage にアンマーシャリングすることで、データを部分的にアンマーシャリングできます。 json.RawMessage は生の JSON 値を表し、後で目的の構造体に直接アンマーシャリングできます。
コードの例
提供された例では、次のようなコード:
var myMap map[string]json.RawMessage ... switch k { case "ping": // ... case "ack": err = json.Unmarshal(v, &myAck) }
このアプローチでは、値の型が知られています。ただし、さまざまなケースを処理するには、switch ステートメントを記述する必要があります。
以上がダブルアンマーシャリングなしでGoでJSONを解析するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。