我从 API 端点收到一个 json 响应,如下所示:
{
"items": [
{
"key": "",
"groupReference": "mastercard-XXXXXXXXXXXXXXX",
"type": "firstPresentment-dms",
"created": "2023-01-27T10:07:56.038Z",
"entry": 1,
"isCorrection": false,
"reportingFor": "0000",
"network": "mastercard",
"fundsTransferDate": "2023-01-27",
"fundsTransferBookDate": "2023-01-27",
}
]
}
Run Code Online (Sandbox Code Playgroud)
我已经使用decode_json()来解码它。问题是因为 isCorrection 是一个纯 perl 布尔值,解码无法正常工作,我得到了这个
Reference of JSON::PP::Boolean$VAR1 = bless( do{(my $o = 0)}, 'JSON::PP::Boolean' );
Run Code Online (Sandbox Code Playgroud)
知道如何解决这个问题吗?
解码无法正常工作
哦,但确实如此。从 JSON 到 Perl 的映射的文档包括:
真假
这些 JSON 原子分别变为
JSON::PP::true和JSON::PP::false。1它们超载,几乎与数字和完全相同0。您可以使用该JSON::PP::is_bool函数检查标量是否为 JSON 布尔值。
因此,如果您将获得的值视为布尔值,那么一切都会正常工作:
#!/usr/bin/perl
use strict;
use warnings;
use feature 'say';
use JSON::PP;
my $response = '{
"items": [
{
"key": "",
"groupReference": "mastercard-XXXXXXXXXXXXXXX",
"type": "firstPresentment-dms",
"created": "2023-01-27T10:07:56.038Z",
"entry": 1,
"isCorrection": false,
"reportingFor": "0000",
"network": "mastercard",
"fundsTransferDate": "2023-01-27",
"fundsTransferBookDate": "2023-01-27"
}
]
}';
my $data = decode_json($response);
if ($data->{items}[0]{isCorrection}) {
say "Value is true";
} else {
say "Value is false";
}
Run Code Online (Sandbox Code Playgroud)
只有当您打破封装并开始期望那里的特定值时,事情才会出错。但是您可以使用OO 版本的接口和boolean_values()或core_bools()方法来解决这个问题。