Как я могу преобразовать логические значения JSON для вывода с использованием XMLout?

В используемой мной структуре данных JSON есть логические значения. Когда звоните decode_json преобразовать его в структуру данных Perl и передать в XMLout функция предоставлена XML::Simple, он выдает ошибку, потому что XMLout не знает как с этим бороться JSON::XS::Boolean ценности.

Есть ли способ конвертировать JSON::XS::Boolean значения в структуре данных в XML?

my $text = '{"a":"x","b":true}'; 
my $result = decode_json($text);
my $rec = XMLout( $result, RootName => 'root', SuppressEmpty => 1);

В коде abive я получаю следующую ошибку - Не могу закодировать значение типа: JSON::XS::Boolean

print Dumper $result дает:

$result = {
        'a' => 'x',
        'b' => bless( do{\(my $o = 1)}, 'JSON::XS::Boolean' )
      };

2 ответа

Решение

Я задал тот же вопрос на PerlMonks и воспроизводю предложенное решение ниже.

По сути, решение состоит в том, чтобы изменить значение JSON::XS::Boolean на соответствующее значение перед передачей его в XMLout:

use strict;
use warnings;

use JSON;
use XML::Simple;

my $text = '{"a":"x","b":true}';
my $result = decode_json($text);

for my $value ( values %$result ) {
    next unless 'JSON::XS::Boolean' eq ref $value;
    $value = ( $value ? 'true' : 'false' );
}

print XMLout( $result, RootName => 'root', SuppressEmpty => 1);

Выход:

C:\Temp> test.pl
<root a="x" b="true" />

Редактировать: я написал этот ответ перед всеми правками на исходный вопрос. Вопрос, который был сформулирован сейчас, заключается в том, что оригинальный автор хочет создать XML-готовую структуру для использования с XML::Simple; Первоначально утверждалось, что он просто хотел поместить структуру JSON в текстовый узел.

Perl объекты должны быть JSON-кодированы перед отправкой их по проводам.

Из вашего примера:

my $text = '{"a":"x","b":true}'; 
my $result = decode_json($text);
print JSON->new->utf8->pretty(1)->encode($result);

Вы получаете следующее:

$ perl json.pl 
{
   "a" : "x",
   "b" : true
}
Другие вопросы по тегам