我有一个像下面这样的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响应的格式如上所示。我已经验证输入正确并按预期传递。这只是转换问题。
答案 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
}
}
]
};
这是我尝试使用元素
isOK
和enabled
的值的方式。
期望布尔值具有特定值是错误的。变化
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)