JSON-декодирование Perl не дает ожидаемого результата
У меня ниже JSON вход -
{"links": {"self": "/ some / path"}, "data": [{"type": "some_service", "id": "foo", "attribute": {"creation": true, "active": true, "приостанавливается":false}}, {"type":"some_service","id":"dummy","attribute": {"made":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'
}
};
Похоже, что значение в 'selected' равно $VAR1->{'data'}[0]{'attribute'} {'active'}, что, похоже, не совсем точно, и то же самое происходит и в других местах.
Я пропускаю где-то в коде или ввод JSON имеет какую-то ошибку? Пожалуйста, предоставьте ваши предложения.
2 ответа
Декодер 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;
Почему вы думаете, что это неточно? Если мы посмотрим на JSON, active
а также created
оба имеют одинаковое значение: 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'
}
};