【发布时间】:2017-07-25 09:13:20
【问题描述】:
我不熟悉 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
}
如何直接获取 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
从这里开始已经很丑了。 %$ 在那里做什么?我以为我可以做类似print ${ $json->{'Results'}->[1] }{'Readings'}; 的事情,但这让我无处可去。
给我智慧。如何直接访问协议值?如何直接访问状态值?最后,如何获取别名属性?
我不知道我在做什么,但我正在使用my $test = %{${%$json{Results}}[0]}{Name}; #I get "Custom_Light", nice。这是随机抛出大量奇怪的% 和$ 的方法吗?
【问题讨论】:
-
要获取
Value字段,您可以编写:$json->{Results}[0]{Readings}{state}{Value}。并获得alias:$json->{Results}[0]{Attributes}{alias} -
是的!这看起来很漂亮。把它变成一个答案,这样我就可以给你一些爱。
-
“
%$在那里做什么?”我想知道,但我以为是你写的! -
我确实写了它并且它有效。在论坛中对如何在 perl 中“取消引用”(无论如何,我知道强制转换)哈希表进行一些调查后,发现
%$。您的解决方案看起来好多了