【发布时间】:2016-03-23 03:35:10
【问题描述】:
我有一个像下面这样的 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
}
当元素的值不是布尔值(真/假)时,转换正确发生,但当其布尔值时,输出被破坏。
如果您将看到元素 'enabled' 和 '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";
}
注意: 函数“from_json”或“decode_json”的输入来自 REST 响应,格式如上所示。我已验证输入是否正确传递并符合预期。它只是这里的转换问题。
【问题讨论】:
-
JSON::PP::Boolean 只是一个包含 0(Perl 中为假)和 1(Perl 中为真)的对象。没有任何损坏。
-
为什么我看到这样的价值 'isOK' => bless(do{(my $o = 0)}, 'JSON::PP::Boolean' ), 'enabled' => $ VAR1->{'entries'}[0]{'content'}{'isOK'},
-
正确的转换应该如下 'isOK' => false, 'enabled' => false,
-
因为字符串
false在 Perl 中是真实的。 JSON.pm 为布尔值创建了一个包装器,因此它们在 Perl 中的含义与在原始 JSON 中的含义相同。见metacpan.org/pod/JSON#true-false -
正确我同意。但我的问题是为什么我将值视为 'bless(do{(my $o = 0)}, 'JSON::PP::Boolean')' 而不是 false 或 1/0。我怎样才能避免像上面这样的转换。