You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 19:18:02