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

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.这是多少奇怪的%,$随机抛出的方式?

Bor*_*din 5

你要

$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)