【问题标题】:How can I convert JSON boolean values for output using XMLout?如何使用 XMLout 将 JSON 布尔值转换为输出?
【发布时间】:2009-06-22 14:48:12
【问题描述】:

我使用的 JSON 数据结构中有布尔值。当调用decode_json 将其转换为Perl 数据结构并提供给XML::Simple 提供的XMLout 函数时,它会抛出错误,因为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);

在上面的代码中,我收到以下错误 - 无法编码类型的值:JSON::XS::Boolean

print Dumper $result 给出:

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

【问题讨论】:

  • 您的问题不是关于 JSON,而是关于如何获取 XML::Simple 以识别 JSON 布尔值并将其编码到其输出中。你应该重写这个问题,这样才有意义,因为我认为我不应该去改变整个事情。另外,您没有听说过 Perl 中的单引号吗?我的 $text = '{"a" : "x", "b": true}';为什么让其他人难以阅读您的代码?

标签: perl json xml-simple


【解决方案1】:

我询问了same question on 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" />

【讨论】:

  • 请注意,您不需要each,只需values
  • 我会将条件更改为不依赖于实现细节。请改用 JSON::is_bool($scalar)。
【解决方案2】:

编辑:我在对原始问题进行所有编辑之前写了这个答案。现在所说的问题是,最初的发布者想要创建一个 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
}

【讨论】:

  • 当他将该输出传递给 XML::Simple::XMLout 时,您认为他会得到什么?
猜你喜欢
  • 1970-01-01
  • 2016-10-07
  • 2016-05-14
  • 1970-01-01
  • 1970-01-01
  • 2020-01-05
  • 1970-01-01
  • 2016-01-13
  • 2015-09-27
相关资源
最近更新 更多