【发布时间】:2018-04-25 23:06:57
【问题描述】:
我正在尝试编写一个将在 Centos 6 主机上运行的 Perl 脚本。该脚本将运行一个 shell 命令来查询我们的 AWS 接口,如下所示:
my $json = `aws ec2 describe-instances`;
这个查询将返回一个 JSON 对象,但我相信我的问题是它实际上是作为字符串存储在 $output 中,而不是实际存储在 JSON 对象中。
我正在尝试以下代码:
# Get each instance
my $json = `aws ec2 describe-instances`;
# Decode AWS json result
my $decoded = decode_json $json;
# Find reference type
print "Reference type: " . ref $decoded,"\n";
# Loop through each EC2 instance
print $decoded -> {Reservations} . "\n";
当我执行此代码时,我收到以下消息:
Reference type: HASH
ARRAY(0xa774b0)
谁能帮我解决这个问题?我已经在谷歌上搜索和搞砸了一整天了:(
以下是存储在 $output 中的字符串示例,尽管在实际输出中会有多个实例:
{
"Reservations": [
{
"OwnerId": "82XXXXXXX043",
"ReservationId": "r-0XXXXXXXXXXX",
"Groups": [],
"Instances": [
{
"Monitoring": {
"State": "XXXXX"
},
"PublicDnsName": "XXX",
"RootDeviceType": "XXXXXXX",
"State": {
"Code": XXX,
"Name": "stopped"
},
"EbsOptimized": XXXX,
"LaunchTime": "XXXXXXXXXX",
"PrivateIpAddress": "XXXXXXXXXX",
"ProductCodes": [],
"VpcId": "XXXXXXXXXX",
"StateTransitionReason": "UXXXXXXXXXX",
"InstanceId": "XXXXXXXXXX",
"ImageId": "XXXXXXXXXX",
"PrivateDnsName": "XXXXXXXXXX",
"KeyName": "XXXXXXXXXX",
"SecurityGroups": [
{
"GroupName": "XXXXXXXXXX",
"GroupId": "XXXXXXXXXX"
},
{
"GroupName": "XXXXXXXXXX",
"GroupId": "XXXXXXXXXX"
},
{
"GroupName": "XXXXXXXXXX",
"GroupId": "XXXXXXXXXX"
}
],
"ClientToken": "XXXXXXXXXX",
"SubnetId": "XXXXXXXXXX",
"InstanceType": "XXXXXXXXXX",
"NetworkInterfaces": [
{
"Status": "XXXXXXXXXX",
"MacAddress": "XXXXXXXXXX",
"SourceDestCheck": XXXXXXXXXX,
"VpcId": "XXXXXXXXXX",
"Description": "XXXXXXXXXX",
"NetworkInterfaceId": "XXXXXXXXXX",
"PrivateIpAddresses": [
{
"Primary": XXXXXXXXXX,
"PrivateIpAddress": "XXXXXXXXXX"
}
],
"Ipv6Addresses": [],
"Attachment": {
"Status": "XXXXXXXXXX",
"DeviceIndex": 01234,
"DeleteOnTermination": XXXXXXXXXX,
"AttachmentId": "XXXXXXXXXX",
"AttachTime": "XXXXXXXXXX"
},
"Groups": [
{
"GroupName": "XXXXXXXXXX",
"GroupId": "XXXXXXXXXX"
},
{
"GroupName": "XXXXXXXXXX",
"GroupId": "XXXXXXXXXX"
},
{
"GroupName": "XXXXXXXXXX",
"GroupId": "XXXXXXXXXX"
}
],
"SubnetId": "XXXXXXXXXX",
"OwnerId": "XXXXXXXXXX",
"PrivateIpAddress": "XXXXXXXXXX"
}
],
"SourceDestCheck": XXXXXXXXXX,
"Placement": {
"Tenancy": "XXXXXXXXXX",
"GroupName": "XXXXXXXXXX",
"AvailabilityZone": "XXXXXXXXXX"
},
"Hypervisor": "XXXXXXXXXX",
"BlockDeviceMappings": [
{
"DeviceName": "XXXXXXXXXX",
"Ebs": {
"Status": "XXXXXXXXXX",
"DeleteOnTermination": XXXXXXXXXX,
"VolumeId": "XXXXXXXXXX",
"AttachTime": "XXXXXXXXXX"
}
}
],
"Architecture": "XXXXXXXXXX",
"StateReason": {
"Message": "XXXXXXXXXX",
"Code": "XXXXXXXXXX"
},
"IamInstanceProfile": {
"Id": "XXXXXXXXXX",
"Arn": "XXXXXXXXXX"
},
"RootDeviceName": "XXXXXXXXXX",
"VirtualizationType": "XXXXXXXXXX",
"Tags": [
{
"Value": "XXXXXXXXXX",
"Key": "XXXXXXXXXX"
},
{
"Value": "XXXXXXXXXX",
"Key": "XXXXXXXXXX"
},
{
"Value": "XXXXXXXXXX",
"Key": "XXXXXXXXXX"
},
{
"Value": "XXXXXXXXXX",
"Key": "XXXXXXXXXX"
},
{
"Value": "XXXXXXXXXX",
"Key": "XXXXXXXXXX"
},
{
"Value": "XXXXXXXXXX",
"Key": "XXXXXXXXXX"
}
],
"AmiLaunchIndex": XXXXXXXXXX
}
]
}
]
}
【问题讨论】:
-
您的示例看起来像一个哈希,而不是一个数组。
-
“我的问题是它实际上是作为字符串存储在
$output中,而不是实际存储在 JSON 对象中”。你认为 "JSON 对象" 是什么? JSON 是 JavaScript Object Notation,根据定义,它是一个文本字符串。JSON模块的工作是在 JSON 字符串和它所代表的数据结构之间进行转换。 -
没有变量
$output。你的意思是$json? -
您需要告诉我们您真正想用这些数据做什么。引用类型在这里不是很相关。当您调用
decode_json时,您会将 JSON 字符串转换为 Perl 数据结构。该结构内的层次结构完全映射到 JSON。在您的代码中,您说您循环通过每个 EC2 实例,但您不循环。您打印键Reservations后面的值。这是一个数组引用,如果你打印它,它会变成ARRAY(0xdeadb33f)。这是预期的。如果你想把它转回 JSON,你需要告诉 Perl。encode_json听起来很合理。 -
或者使用 Data::Dumper 或 Data::Printer 来检查 Perl 数据结构。