1

以下のJSON入力があります-

{"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}}]}

私は以下のコードを使用しています -

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'
                 }
    };

'created' の値は $VAR1->{'data'}[0]{'attributes'}{'active'} のように見えますが、これは正確ではないようで、他の場所でも同じことが起こります。

コードのどこかが欠けているのでしょうか、それとも JSON 入力にエラーがありますか? ご提案をお寄せください。

4

2 に答える 2

3

JSON デコーダーは、値を既に解析済みの以前の値に「マッピング/ポイント」しているだけです。あなたの最初のcreatedポイントを見ることができます

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

の値はtrueですactiveData::Dumperハッシュ配列の表現を見ています。

Perl 変数から要素を取得すると、元の入力と一致することがわかります。

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

これを行わずに出力を印刷するData::Dumperには、スクリプトで次のフラグを設定するだけです。

$Data::Dumper::Deepcopy = 1;

于 2015-08-19T07:00:22.040 に答える