Accessing Nested JSON Arrays in Go
In Go, challenges arise when accessing nested JSON arrays after unmarshalling. When attempting to retrieve an element from the "objects" array in a response, the error "type interface {} does not support indexing" may be encountered.
Understanding the Problem
By default, JSON modules in Go represent arrays as []interface{} slices and dictionaries as map[string]interface{} maps. Therefore, when decoding into an interface{} variable, accessing nested elements using indexing directly will fail.
Solution: Type Assertion
One approach to address this issue is through type assertion. This involves converting the interface{} variable to the underlying concrete type. For example, to extract the ITEM_ID from the first object in the "objects" array:
<code class="go">objects := result["objects"].([]interface{}) first := objects[0].(map[string]interface{}) fmt.Println(first["ITEM_ID"])</code>
Type Assertion with Error Checking
When performing type assertions, it's essential to incorporate error checking to handle incorrect conversions. Example:
<code class="go">objects, ok := result["objects"].([]interface{}) if !ok { // Handle type conversion error }</code>
Decoding into a Structure
An alternative solution, recommended for JSON with a known format, is to decode directly into a custom structure. Define a struct to match the JSON structure, and decode into it:
<code class="go">type Result struct { Query string Count int Objects []struct { ItemId string ProdClassId string Available int } }</code>
This allows you to access data directly, eliminating the need for type assertions:
<code class="go">var result Result json.Unmarshal(payload, &result) fmt.Println(result.Objects[0].ItemId)</code>
The above is the detailed content of How Do I Access Nested JSON Arrays in Go?. For more information, please follow other related articles on the PHP Chinese website!