Golang如何反序列化嵌套JSON数组提取AvailableIpAddressCount值
解决方案
方法1:定义结构体强类型解析(推荐)
这种方式类型安全,不会出现运行时断言错误,只需要定义JSON结构中和你需求相关的字段即可,不需要把所有JSON字段都列出来:
package main import ( "encoding/json" "fmt" ) // 仅定义需要用到的字段,其余字段会被自动忽略 type Subnet struct { AvailableIpAddressCount int `json:"AvailableIpAddressCount"` } type Response struct { Subnets []Subnet `json:"Subnets"` } func main() { // 替换为你实际的JSON数据 jsonData := []byte(`{ "Subnets": [ { "AvailabilityZone": "xx", "AvailableIpAddressCount": 173, 其余省略字段自动忽略 } ] }`) var resp Response err := json.Unmarshal(jsonData, &resp) if err != nil { panic(err) } if len(resp.Subnets) > 0 { fmt.Println(resp.Subnets[0].AvailableIpAddressCount) // 输出目标值173 } }
方法2:使用interface{}动态解析
如果不想定义结构体,需要注意每层的类型转换规则:JSON反序列化后默认对象转map[string]interface{}、数组转[]interface{}、数字转float64,此前报错基本是类型断言的层级或者目标类型不匹配导致:
package main import ( "encoding/json" "fmt" ) func main() { // 替换为你实际的JSON数据 jsonData := []byte(`{ "Subnets": [ { "AvailabilityZone": "xx", "AvailableIpAddressCount": 173, 其余省略字段自动忽略 } ] }`) var result interface{} err := json.Unmarshal(jsonData, &result) if err != nil { panic(err) } // 逐层做类型断言 rootMap := result.(map[string]interface{}) subnets := rootMap["Subnets"].([]interface{}) if len(subnets) > 0 { subnetMap := subnets[0].(map[string]interface{}) // 注意JSON数字默认解析为float64,需要整数的话手动转换类型 count := subnetMap["AvailableIpAddressCount"].(float64) fmt.Println(int(count)) // 输出目标值173 } }
如果频繁处理复杂JSON结构,也可以使用第三方JSON库简化操作,比如gjson、sjson等。
内容的提问来源于stack exchange,提问作者Siddhant Sahni
相关产品推荐
相关产品推荐

