在Perl中解析JSON字符串

Lau*_*ema 0 perl parsing json

我们有一个带有返回JSON字符串的API的设备.我希望能够访问JSON的特定部分,但我无法弄清楚如何使语法工作.

use strict;
use warnings;
use CGI qw(:standard);
use LWP::Simple;
use JSON qw(decode_json);
use Data::Dumper;

my $json_request = 'http://<device ip>/API?method=Display:Input:Status:All:Get';
my $raw_json = get $(json_request)
print($raw_json) 
# Output: {"result":{"0":{"status":false},"1":{"status":false},"2":{"status":false},"3":{"status":false},"4":{"type":"unknown","status":true}},"jsonrpc":"2.0"} 
Run Code Online (Sandbox Code Playgroud)

我尝试过使用JSON库的decode_json函数以及Data :: Dumper,但这是我得到的:

print(Dumper(decode_json($raw_json)));
# Output: $VAR1 = { 'jsonrpc' => '2.0', 'result' => { '4' => { 'status' => bless( do{\(my $o = 1)}, 'JSON::PP::Boolean' ), 'type' => 'unknown' }, '1' => { 'status' => bless( do{\(my $o = 0)}, 'JSON::PP::Boolean' ) }, '3' => { 'status' => $VAR1->{'result'}{'1'}{'status'} }, '0' => { 'status' => $VAR1->{'result'}{'1'}{'status'} }, '2' => { 'status' => $VAR1->{'result'}{'1'}{'status'} } } }; 
Run Code Online (Sandbox Code Playgroud)

这不仅看起来更加乱码而且它没有正确处理某些元素,我似乎无法访问Dumper输出或raw_json变量的元素.我是Perl的新手,但我已经尝试了所有我能想到的语法,我无法理解.

我希望能够只有一个表0到4的表,只是说"true"或"false",具体取决于该特定JSON元素的条目.这里是JSON结果的EG,

0: False
1: False
2: False
3: False
4: True
Run Code Online (Sandbox Code Playgroud)

Ste*_*ker 7

我不确定你的意思,只要我能看到你的JSON包含你要提取的所有数据:

$ echo '{"result":{"0":{"status":false},"1":{"status":false},"2":{"status":false},"3":{"status":false},"4":{"type":"unknown","status":true}},"jsonrpc":"2.0"}' | json_pp 
{
   "jsonrpc" : "2.0",
   "result" : {
      "0" : {
         "status" : false
      },
      "4" : {
         "type" : "unknown",
         "status" : true
      },
      "1" : {
         "status" : false
      },
      "3" : {
         "status" : false
      },
      "2" : {
         "status" : false
      }
   }
}
Run Code Online (Sandbox Code Playgroud)

也许您还没有理解如何正确访问它?以下代码似乎有效:

#!/usr/bin/perl
use strict;
use warnings;

use JSON qw(decode_json);

my $raw_json = '{"result":{"0":{"status":false},"1":{"status":false},"2":{"status":false},"3":{"status":false},"4":{"type":"unknown","status":true}},"jsonrpc":"2.0"}';
print "${raw_json}\n";

my $object = decode_json($raw_json)
    or die "JSON parse error\n";

my $result = $object->{result};
die "No result object found\n"
    unless $result;

foreach my $key (sort keys %{$result}) {
    print "${key}: ", $result->{$key}->{status} ? "True": "False", "\n";
}

exit 0;
Run Code Online (Sandbox Code Playgroud)

输出:

{"result":{"0":{"status":false},"1":{"status":false},"2":{"status":false},"3":{"status":false},"4":{"type":"unknown","status":true}},"jsonrpc":"2.0"}
0: False
1: False
2: False
3: False
4: True
Run Code Online (Sandbox Code Playgroud)