perl中的from_json和decode_json无法按预期工作

时间:2016-03-22 18:18:23

标签: json perl

我有一个像下面这样的json。

$response = {"entries":[{"content":{"eStatus":0,"id":"0","enabled":false,"isOK":false,}}]}
 $responseContent = from_json($response);

当我在perl代码中使用from_json或decode_json时,我得到了跟随转换后的json。

                     'content' => {
                                      'id' => '0',
                                      'esrsVeAddress' => '',
                                      'isOK' => bless( do{\(my $o = 0)}, 'JSON::PP::Boolean' ),
                                      'enabled' => $VAR1->{'entries'}[0]{'content'}{'isOK'},
                                      'eStatus' => 0
                                    }

当element的值不是boolean(true / false)时,转换正常,但是当它的布尔值输出被破坏时。

如果您看到元素'已启用'并且' isOK'两者都错了。

我使用了错误的功能' from_json'或者' decode_json'这里。

感谢任何建议或指导。

这是我尝试使用元素isOK的值并启用的方式。

  if (  $isOK = $responseContent->{'entries'}[0]->{'content'}->     {'isOK'} eq "1" ) {
     c4lx_log "value is found to be true and so do some business logic";
 }
 else {
    c4lx_log "value is found to be false and so dont do anything here";
 }

注意: 输入到fucntion' from_json'或者' decode_json'来自REST响应的格式如上所示。我已经验证输入正确并按预期传递。这只是转换问题。

1 个答案:

答案 0 :(得分:1)

  

如果您看到元素'已启用'并且' isOK'两者都错了。

不,他们是对的。 {J}中的->{enabled}->{isOK}都是假的。

  

如何避免上述转换

您实际上是在问为什么模块没有转换值(到字符串或数字)。这会导致信息丢失。例如,如果您要执行转换,encode_json(decode_json($json))将更改数据。

  

这里可以做些什么来制作我期待的值[哪个] 'content' => { 'id' => '0', 'esrsVeAddress' => '', 'isOK' => false, 'enabled' => false, 'eStatus' => 0 }

使用Data :: Dumper是不可能的。 Data :: Dumper生成有效的Perl代码,并且它不是有效的Perl代码。但是,您可以使用

来接近它
print(Data::Dumper->Dump(
   [ JSON::false, JSON::true, $responseContent ],
   [qw( $false $true $responseContent )]));

它产生以下输出:

$false = bless( do{\(my $o = 0)}, 'JSON::PP::Boolean' );
$true = bless( do{\(my $o = 1)}, 'JSON::PP::Boolean' );
$responseContent = {
                     'entries' => [
                                    {
                                      'content' => {
                                                     'id' => '0',
                                                     'eStatus' => 0,
                                                     'enabled' => $false,
                                                     'isOK' => $false
                                                   }
                                    }
                                  ]
                   };
  

这是我尝试使用元素isOKenabled的值的方式。

期望布尔值具有特定值是错误的。变化

my $isOK;  
if ($isOK = $responseContent->{'entries'}[0]->{'content'}->{'isOK'} eq "1")

if ($responseContent->{'entries'}[0]->{'content'}->{'isOK'})

可以简化为

if ($responseContent->{entries}[0]{content}{isOK})

如果您想稍后存储结果,请使用

my $isOK = $responseContent->{entries}[0]{content}{isOK};
if ($isOK)