大家好,我是一个尝试学习Go的初学者。我正在尝试使用带有Golang的AWS开发工具包来获取EC2实例的状态。我可以成功获取实例的JSON响应。但是,我在尝试解析JSON响应以获取实例状态时遇到问题。
以下是我如何获取JSON响应:
result, err := ec2Svc.DescribeInstanceStatus(input)
其中输入的类型为ec2.DescribeInstanceStatusInput
以下是我得到的JSON响应:
{
"InstanceStatuses": [
{
"AvailabilityZone": "ap-southeast-2b",
"Events": null,
"InstanceId": "[VALIDIMAGEID]",
"InstanceState": {
"Code": 16,
"Name": "running"
},
"InstanceStatus": {
"Details": [
{
"ImpairedSince": null,
"Name": "reachability",
"Status": "passed"
}
],
"Status": "ok"
},
"OutpostArn": null,
"SystemStatus": {
"Details": [
{
"ImpairedSince": null,
"Name": "reachability",
"Status": "passed"
}
],
"Status": "ok"
}
}
],
"NextToken": null
}
然后我将DescribeInstanceStatusOutput类型的结果解析为String,然后将其传递给函数parseJson,在此我尝试解析JSON。
result, err := ec2Svc.DescribeInstanceStatus(input)
if err != nil {
fmt.Println("Error", err)
} else {
parseJson(result.String())
//fmt.Printf("%v\n", result)
}
func parseJson(ec2StatusDescription string){
//var x string = ec2StatusDescription.String()
//fmt.Print(ec2StatusDescription)
data := []byte(ec2StatusDescription)
var instanceOutputs InstanceOutput
json.Unmarshal(data, &instanceOutputs)
fmt.Print(instanceOutputs.InstanceStatuses[0].InstanceState.Name)
}
type InstanceOutput struct {
InstanceStatuses [] InstanceStatuses
NextToken *string
}
type InstanceStatuses struct {
AvailabilityZone string
Events *string
InstanceId string
InstanceState InstanceState
InstanceStatus InstanceStatus
OutpostArn *string
SystemStatus SystemStatus
}
type InstanceState struct {
Code int
Name string
}
type InstanceStatus struct {
Details [] InstanceDetails
Status string
}
type InstanceDetails struct {
ImpairedSince *string
Name string
Status string
}
type SystemStatus struct {
Details [] InstanceDetails
Status string
}
我正在尝试打印实例状态,但是我一直使索引超出范围,这是因为未正确解析JSON。我在这里缺少什么导致json无法正确解析?还是我在这里做的事情完全弄错了?任何帮助将不胜感激。