panic: json:如何在Golang中拆解嵌套json数组



我在解组嵌套json数组时遇到了麻烦。下面的示例:

{
"Subnets": [
{
"AvailabilityZone": "xx",
"AvailabilityZoneId": "xx",
"AvailableIpAddressCount": 173,
"CidrBlock": "xx",
"DefaultForAz": "xx",
"MapPublicIpOnLaunch": "xx",
"MapCustomerOwnedIpOnLaunch": "xx",
"State": "xx",
"SubnetId": "xx",
"VpcId": "xx",
"OwnerId": "xx",
"AssignIpv6AddressOnCreation": "xx",
"Ipv6CidrBlockAssociationSet": [],
"Tags": [
{
"Key": "Name",
"Value": "xx"
},
{
"Key": "workload",
"Value": "xx"
},
{
"Key": "xx",
"Value": "xx"
},
{
"Key": "aws:cloudformation:stack-name",
"Value": "xx"
},
{
"Key": "host_support_group",
"Value": "xx"
},
{
"Key": "environment",
"Value": "xx"
},
{
"Key": "client",
"Value": "xx"
},
{
"Key": "aws:cloudformation:stack-id",
"Value": "xx"
},
{
"Key": "application",
"Value": "Subnet"
},
{
"Key": "xx",
"Value": "xx"
},
{
"Key": "xx",
"Value": "xx"
},
{
"Key": "xx",
"Value": "xx"
},
{
"Key": "regions",
"Value": "ca-central-1"
}
],
"SubnetArn": "xx"
}]
,
"ResponseMetadata": {
"RequestId": "xx",
"HTTPStatusCode": 200,
"HTTPHeaders": {
"x-amzn-requestid": "xx",
"cache-control": "no-cache, no-store",
"strict-transport-security": "max-age=31536000; includeSubDomains",
"content-type": "text/xml;charset=UTF-8",
"content-length": "3176",
"vary": "accept-encoding",
"date": "xx",
"server": "AmazonEC2"
},
"RetryAttempts": 0
}
}

我想要的唯一值是"AvailableIpAddressCount",我尝试使用接口{},但我无法获得必要的值。这是Golang playground链接- playground

——错误我使用接口{}

得到这个错误是否有其他方法可以提取"availableipaddresscount";值从json对象?

任何帮助或参考都是感激的。

您可以创建一个具有所需字段的结构体,并使用该结构体解组JSON字节,该结构体将填充结构体中提到的字段。

type Something struct {
AvailableIpAddressCount int `json:"AvailableIpAddressCount"`
}
var data Something
if err := json.unmarshal(byt, &data); err != nil {
panic(err)
}
AvailableIpAddressCount = data.AvailableIpAddressCount

Go使用静态结构体来解码json,因此您可能需要创建一个结构体,其中至少包含您正在寻找的内容。如果你有你的结构,你可以访问AvailableIPAddressCount这样的:

tmp.Subnets[0].AvailableIPAddressCount

操场在这里https://play.golang.org/p/FsjeOubov1Q。

要从示例json中创建json结构,可以使用如下工具:

如果需要遍历所有子网:

for _, subnet := range tmp.Subnets {
fmt.Println(subnet.AvailableIPAddressCount)
}

如果你想动态使用json,你也可以使用https://github.com/spf13/viper。但它可能比静态解码慢。

最新更新