Den*_*s G -1 arrays perl hash 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
}
Run Code Online (Sandbox Code Playgroud)
如何直接获取Reading> Protocol Value和Reading> state Value以及Attributes> Alias?
我使用默认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
Run Code Online (Sandbox Code Playgroud)
从这里开始它已经很难看了.在那%$
做什么?我以为我可以做一些类似print ${ $json->{'Results'}->[1] }{'Readings'};
但却无处可去的事情.
给我智慧.如何直接访问协议值?如何直接访问状态值?最后,如何获取别名属性?
我不知道我在做什么,但我已经到了某个地方my $test = %{${%$json{Results}}[0]}{Name}; #I get "Custom_Light", nice
.这是多少奇怪的%
,$
随机抛出的方式?
你要
$json->{Results}[0]{Readings}{protocol}{Value}
Run Code Online (Sandbox Code Playgroud)
$json->{Results}[0]{Readings}{state}{Value}
Run Code Online (Sandbox Code Playgroud)
$json->{Results}[0]{Attributes}{alias}
Run Code Online (Sandbox Code Playgroud)
但是,由于该项Results
是一个数组,您可能希望迭代其所有元素,尽管在这种情况下只有一个元素
我发现将一级引用一次提取到临时变量中很有用.它看起来像这样
my $results = $json->{Results};
for my $result ( @$results ) {
my $readings = $result->{Readings};
my $attributes = $result->{Attributes};
printf "Protocol: %s\n", $readings->{protocol}{Value};
printf "State: %s\n", $readings->{state}{Value};
printf "Alias: %s\n", $attributes->{alias};
print "\n";
}
Run Code Online (Sandbox Code Playgroud)