【问题标题】:Loop through JSON Structure in Perl循环遍历 Perl 中的 JSON 结构
【发布时间】:2018-10-05 01:15:12
【问题描述】:

如何用 JSON 数据填充列表?

这是我的代码:

my $groups = get_groups($t);
my @group;
my $i = 0;
do {
    push(@group, {
        groups  => [
            { type => $groups->{groups}->[$i]->{type} , group => $groups->{groups}->[$i]->{group} },
        ]
    });
    $i++;
} while ($i < length $groups->{groups});

这是 json 示例:

{
    "error":false,
    "message":"success",
    "group":[
        {"type":1,"group":"group1"},
        {"type":2,"group":"group2"},
        {"type":3,"group":"group3"},
        {"type":4,"group":"group4"},
        {"type":5,"group":"group5"}
    ]
}

函数get_groups($t); 将返回上面的json。我想获取数组group 并将其放入列表groups。但我得到了:

在使用“strict refs”时不能使用字符串(“0”)作为 HASH ref

【问题讨论】:

  • 再次,请在问题中包含您的数据。此外,您可能不想使用do ... while 构造,它非常不成熟且难以阅读。而且这里不再有 JSON。 JSON现在无关紧要。现在只是数据。
  • length $opsteams-&gt;{teams} 可能不是您想要的。这将返回字符串的字符长度,而不是数组的元素长度。试试scalar @{$opstreams-&gt;{teams}}
  • @simbabque 更新了 json 样本。
  • 正如我所说,您需要区分 JSON 和 Perl 数据结构。在您在此处显示的代码中,不再有 JSON。您已经将其转换为 Perl。虽然我可以使用 JSON 数据结构,但如果您想学习如何自己完成所有这些操作,了解其中的区别很重要。
  • @bluepanther:看来你有点挣扎。您最近发布了一些问题,在每种情况下,您似乎都没有真正理解您收到的对先前问题的答案。我建议您花几个小时仔细阅读并确保您了解这里发生了什么。例如,你知道 JSON 和从 JSON “解码”出来的 Perl 数据结构之间的区别吗?了解基础知识很重要。

标签: json perl


【解决方案1】:

来自the documentation of length:

返回 EXPR 值的字符长度。如果 EXPR 是 省略,返回 $_ 的长度。如果 EXPR 未定义,则返回 未定义。

此函数不能用于整个数组或散列来找出 这些有多少元素。为此,请使用标量 @array 和标量 键 %hash ,分别。

要获取数组引用中元素的数量,您需要将其取消引用并将其放入标量上下文中。

my $foo = [ qw/a b c/ ];
my $number_of_elements = scalar @{ $foo }; # 3

您真正想要做的是遍历 teams 数组中的每个团队。无需获取元素数量。

my @teams;
foreach my $team ( @{ $opsteams->{teams} } ) {
    push @teams, {
        type => $team->{type},
        team => $team->{team},
    };
}

您的代码中有一些额外的深度。我不确定它们是干什么用的。实际上,您似乎只想要@teams 中的团队,这确实是

my @teams = @{ $opsteams->{teams} };

【讨论】:

    猜你喜欢
    • 2021-03-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-23
    • 1970-01-01
    • 2016-08-20
    相关资源
    最近更新 更多