【问题标题】:Convert Perl string to json array将 Perl 字符串转换为 json 数组
【发布时间】: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 对象" 是什么? JSONJavaScript Object Notation,根据定义,它是一个文本字符串。 JSON 模块的工作是在 JSON 字符串和它所代表的数据结构之间进行转换。
  • 没有变量$output。你的意思是$json
  • 您需要告诉我们您真正想用这些数据做什么。引用类型在这里不是很相关。当您调用decode_json 时,您会将 JSON 字符串转换为 Perl 数据结构。该结构内的层次结构完全映射到 JSON。在您的代码中,您说您循环通过每个 EC2 实例,但您不循环。您打印键 Reservations 后面的值。这是一个数组引用,如果你打印它,它会变成ARRAY(0xdeadb33f)。这是预期的。如果你想把它转回 JSON,你需要告诉 Perl。 encode_json 听起来很合理。
  • 或者使用 Data::Dumper 或 Data::Printer 来检查 Perl 数据结构。

标签: json string perl


【解决方案1】:

您的 JSON 以 { 开头,因此错误非常正确。你没有数组引用,你有一个哈希引用。

试试print ref $decoded,"\n",它会告诉你你有什么类型的参考。

尝试$decoded -> {Reservations} 或使用Data::Dumper 打印整个内容:

use Data::Dumper;
print Dumper $decoded;

【讨论】:

  • 那么它就可以工作了。问题排序。您的哈希取消引用为您提供了一个数组。您可以根据需要迭代数组。请不要修改您的问题以提出其他问题 - 这会使您获得的任何答案无效,这些答案应该供其他人参考。
  • 我想我不确定如何遍历哈希。所以 $decoded 现在是一个我可以循环遍历的数组?我会试试...
  • 没有。 $decoded -> {Reservations} 是一个数组引用。您可以使用for my $reservation ( @{$decoded->{Reservations}} ) { 对其进行迭代,然后您会发现$reservation 是另一个哈希引用
【解决方案2】:

您已成功将 JSON 字符串转换为 Perl 数据结构。看起来你跌倒了,因为你不知道如何操作 Perl 数据结构。阅读 perldsc 手册页可能会有所帮助。

我看到$decoded->{Reservations} 是一个数组引用。因此,您将能够使用如下代码遍历该数组:

foreach my $reservation (@{ $decoded->{Reservations} }) {
  # Do something useful with $reservation
}

或者,您可以考虑使用像 Paws 这样的库来处理您的 AWS 交互。

【讨论】:

    猜你喜欢
    • 2021-05-01
    • 1970-01-01
    • 2020-04-27
    • 2013-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-07
    相关资源
    最近更新 更多