perl JSON解码没有给出预期的结果

时间:2015-08-19 06:40:57

标签: json perl data-dumper

我有以下JSON输入 -

  

{"链接" {"自":" /一些/路径"}"数据&#34 ;:   [{"类型":" some_service"" ID":"富""属性&#34 ;:   {"创建":真,"有源":真,"暂停":假}},   {"类型":" some_service"" ID":"虚设""属性" {&#34 ;创建":假}}]}

我正在使用以下代码 -

use strict;
use warnings;
use JSON::XS;
use Data::Dumper;

my $result = decode_json($input);
print Dumper($result) . "\n";

但我的输出低于输出 -

$VAR1 = {
      'data' => [
                  {
                    'attributes' => {
                                      'active' => bless( do{\(my $o = 1)}, 'JSON::XS::Boolean' ),
                                      'created' => $VAR1->{'data'}[0]{'attributes'}{'active'},
                                      'suspended' => bless( do{\(my $o = 0)}, 'JSON::XS::Boolean' )
                                    },
                    'id' => 'foo',
                    'type' => 'some_service'
                  },
                  {
                    'id' => 'dummy',
                    'attributes' => {
                                      'created' => $VAR1->{'data'}[0]{'attributes'}{'suspended'}
                                    },
                    'type' => 'some_service'
                  }
                ],
      'links' => {
                   'self' => '/some/path'
                 }
    };

看起来'已创建'是$ VAR1-> {'数据'} [0] {'属性'} {'有效'}这似乎不准确,同样的情况发生在其他地方也是。

我错过了代码中的某处或者JSON输入有错误吗? 请提供您的建议。

2 个答案:

答案 0 :(得分:3)

JSON解码器只是"映射/指向"已解析的先前值的值。您可以看到第一个created

$VAR1->{'data'}[0]{'attributes'}{'active'},

,其值为true,就像active一样。您正在查看哈希数组的Data::Dumper表示。

如果要从Perl变量中检索元素,您会发现它与原始输入匹配:

print $result->{"data"}[0]->{"attributes"}->{"created"}; # prints 1

要在不发生这种情况的情况下打印Data::Dumper输出,只需在脚本中设置此标志:

$Data::Dumper::Deepcopy = 1;

答案 1 :(得分:0)

为什么你认为它不准确?如果我们查看JSON,activecreated都具有相同的值:true。也许您会发现如何更清楚地转储结构如下:

use JSON::XS     qw( decode_json );
use Data::Dumper qw( );

my $data = decode_json(<<'__EOI__');
{"links":{"self":"/some/path"},"data [{"type":"some_service","id":"foo","attributes": {"created":true,"active":true,"suspended":false}}, {"type":"some_service","id":"dummy","attributes":{"created":false}}]}
__EOI__

print(Data::Dumper->Dump(
   [ JSON::XS::true, JSON::XS::false, $data ],
   [qw( true false data )],
));

输出:

$true = bless( do{\(my $o = 1)}, 'JSON::PP::Boolean' );
$false = bless( do{\(my $o = 0)}, 'JSON::PP::Boolean' );
$data = {
          'data' => [
                      {
                        'attributes' => {
                                          'active' => $true,
                                          'created' => $true,
                                          'suspended' => $false
                                        },
                        'id' => 'foo',
                        'type' => 'some_service'
                      },
                      {
                        'attributes' => {
                                          'created' => $false
                                        },
                        'id' => 'dummy',
                        'type' => 'some_service'
                      }
                    ],
          'links' => {
                       'self' => '/some/path'
                     }
        };