Go でのネストされた JSON 配列へのアクセス
Go では、アンマーシャリング後にネストされた JSON 配列にアクセスするときに問題が発生します。応答の「objects」配列から要素を取得しようとすると、「type Interface {} はインデックス付けをサポートしていません」というエラーが発生する場合があります。
問題の理解
デフォルトでは、Go の JSON モジュールは配列を []interface{} スライスとして表し、辞書を map[string]interface{} マップとして表します。したがって、インターフェイス変数にデコードする場合、インデックスを直接使用してネストされた要素にアクセスすると失敗します。
解決策: 型アサーション
この問題に対処する 1 つのアプローチは、型アサーション。これには、interface 変数を基礎となる具象型に変換することが含まれます。{}たとえば、「objects」配列の最初のオブジェクトから ITEM_ID を抽出するには、次のようにします。
<code class="go">objects := result["objects"].([]interface{}) first := objects[0].(map[string]interface{}) fmt.Println(first["ITEM_ID"])</code>
エラー チェック付きの型アサーション
型アサーションを実行するときは、不正な変換を処理するためにエラー チェックを組み込むことが不可欠です。例:
<code class="go">objects, ok := result["objects"].([]interface{}) if !ok { // Handle type conversion error }</code>
構造へのデコード
既知の形式の JSON に推奨される代替ソリューションは、カスタム構造に直接デコードすることです。 JSON 構造と一致する構造体を定義し、それにデコードします:
<code class="go">type Result struct { Query string Count int Objects []struct { ItemId string ProdClassId string Available int } }</code>
これにより、型アサーションの必要がなく、データに直接アクセスできるようになります:
<code class="go">var result Result json.Unmarshal(payload, &result) fmt.Println(result.Objects[0].ItemId)</code>
以上がGo でネストされた JSON 配列にアクセスするにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。