直接访问 perl 中的嵌套 JSON 数据?



我不熟悉Perl的哈希/引用语法,这让我的眼睛受伤。
我有以下 JSON:

{
"Arg":"Custom_Light state alias protocol",
"Results": [
{
"Name":"Custom_Light",
"Internals": { },
"Readings": {
"protocol": { "Value":"V3", "Time":"2017-01-14 18:49:18" },
"state": { "Value":"off", "Time":"2017-03-05 10:39:50" }
},
"Attributes": {      "alias": "Kitchen light" }
}  ],
"totalResultsReturned":1
}

如何直接获取读取>协议值和读取>状态值以及属性>别名?

我正在使用默认的JSON编码器/解码器,它工作得很好。使用Dumper($json)我得到了所有的 JSON,但我不知道如何直接访问它,而无需将 foreach 与数组中的所有数组一起使用。

我尝试了以下方法:

my $json = from_json( $readout, { utf8  => 1 } );
print "No. Entries:", scalar(keys($json)); #works, returns 3
my @results = %$json{Results};
Dumper(@results[1]); #I get the Results array

从这里开始,它已经很丑了。%$在那里做什么?我以为我可以做类似print ${ $json->{'Results'}->[1] }{'Readings'};的事情,但这让我无处可去。

给我智慧。如何直接访问协议值?如何直接访问状态值?最后,如何到达别名属性?


我不知道我在做什么,但我正在和my $test = %{${%$json{Results}}[0]}{Name}; #I get "Custom_Light", nice一起到达某个地方.这是一条路,有无数奇怪的%$只是随机扔进去吗?

你想要

$json->{Results}[0]{Readings}{protocol}{Value}
$json->{Results}[0]{Readings}{state}{Value}
$json->{Results}[0]{Attributes}{alias}

但是,由于Results项是一个数组,因此您可能希望遍历其所有元素,尽管在这种情况下只有一个元素

我发现一次将一个级别的引用提取到临时变量中很有用。它看起来像这样

my $results = $json->{Results};
for my $result ( @$results ) {
my $readings   = $result->{Readings};
my $attributes = $result->{Attributes};
printf "Protocol: %sn", $readings->{protocol}{Value};
printf "State:    %sn", $readings->{state}{Value};
printf "Alias:    %sn", $attributes->{alias};
print "n";
}

看看perlreftutperldscperlref,它将帮助您了解如何在 Perl 中访问深度嵌套结构。

打印"否。条目:", 标量(键($json));#works,返回 3

实际上,这将不再起作用。在标量上使用keys是Perl 5.14中添加的一个实验性功能,它允许用标量参数调用eachkeyspushpopshiftspliceunshiftvalues。此实验被认为不成功,并在 5.23 中删除。参见 现在禁止标量上的实验值。因此,您应该在应用keys之前取消引用哈希引用$json

print "No. Entries:", scalar keys %$json;

perlref中所述,%$ref取消引用哈希引用$ref。接下来,让我们看一下这一行:

我的@results = %$json{结果};

这实际上首先创建了一个新的(匿名)哈希( Result => $json->{Result} ),然后将其分配给@results制作@result = ( 'Result', $json->{Result} )。所以这就是为什么你现在可以把$json->{Result}[0]称为$result[1].

但这是晦涩难懂的编码,可能也不是故意的。因此,回到您的问题,获取您可以编写的Value字段:

my $value = $json->{Results}[0]{Readings}{state}{Value};

要获取alias字段,请执行以下操作:

my $alias = $json->{Results}[0]{Attributes}{alias};

最新更新