json - 如何从 perl 脚本发送 boolean 值而不将它们转换为字符串

标签 json perl boolean

我将 Perl 数据结构传递给 encode_json ,并使用其返回值作为输入以发布到 RESTful API。

例子:

$data = (input1 => true);
$json_data = encode_json($data);
print $json_data; // Prints: ["input1":"true"]

$url= http://api.example.com/resources/getDataAPI
$headers = {Accept => 'application/json', Authorization => 'Basic ' . encode_base64($username . ':' . $password)};

$client = REST::Client->new();
$client->POST($url,($json_data,$headers));

这一切正常。

最近另一位开发人员很少进行输入参数验证检查,REST 严格接受 boolean 值,不带引号。

我现在需要将我的输入发送为
$data = '["inout1":true]'
$client = REST::Client->new();
$client->POST($url,($data,$headers));

我的所有脚本都失败了,因为输入数据使用 encode_json 编码为 JSON 格式功能。

我可以手动形成 JSON 数据,但输入数据有时会非常庞大​​。无法识别它们并随时修改。

有什么方法可以实现不带引号的传递 boolean 值?

最佳答案

simbabque 的答案相反, 我真的不认为将引用用作 \1 是一个好主意和 \0生产truefalse在 JSON 中。
JSON module 中的常量不仅仅是为了方便。
如果你使用这样的常量,你仍然可以将它们计算为 truefalse Perl 中的值,而 \0\1被评估为 true在 Perl 中。
并且使用这些常量,除了在 Perl 中保留 boolean 值之外,还可以在 JSON 中工作以生成正确的数据。
这是我所说的一个例子:

use 5.010;
use strict;
use warnings;
use JSON qw(encode_json decode_json);

my $data = {
    true_1 => JSON::true,
    true_2 => \1,
    false_1 => JSON::false,
    false_2 => \0,
};

for my $key (sort keys %$data) {
    say "$key value is $data->{$key} and is evaluated as true" if $data->{$key};
    say "$key value is $data->{$key} and is evaluated as false" if not $data->{$key};
}

say encode_json $data;
该代码将输出如下内容:
false_1 value is 0 and is evaluated as false
false_2 value is SCALAR(0x146f39b4c18) and is evaluated as true

true_1 value is 1 and is evaluated as true
true_2 value is SCALAR(0x146f3998918) and is evaluated as true

{"true_2":true,"false_1":false,"false_2":false,"true_1":true}
如您所见,引用 \0 的值( false_2 ) 被评估为 true 在 Perl 中,设置为 JSON::false 的值仍然是 false在 Perl 评估中。
此外,您可以看到,在打印 JSON::true 的值时和 JSON::false ,它们会自动转换为 10 , 而 \1\0打印为 SCALAR(0x146f3998918)SCALAR(0x146f39b4c18) .
最后,当转换为 JSON 时,两者都能正常工作.但是在 Perl 数据结构中设置应该为假的“真”值( 0 、空字符串或 undef )可能会导致代码的其他部分出现错误,您可能会使用相同的结构并评估 boolean 字段做某事。
此外,在开发级别,使用 JSON::true 时,同行开发人员更容易理解您正在编码的内容。和 JSON::false ,而不是将引用视为 \1\0如果他/她不熟悉这种hacky技巧,则无法理解引用的原因。
如果您真的想避免输入额外的 6 个字符,那么您可以在代码顶部执行此操作:
use JSON qw(encode_json decode_json);
sub true () { JSON::true }
sub false () { JSON::false }
然后您可以简单地将它们用作代码中的常量,如下所示:
$data = {
    is_member => true,
    is_suspended => false,
}
虽然,也许常量名称应该全部大写(如 TRUEFALSE ),但这是另一个讨论的主题。
因此,请始终使用 JSON::trueJSON::false使用 Perl 和 JSON 时。它们将在 Perl 中很好地评估,它们被转换为 JSON 中的正确数据类型,并且它们正确地打印到控制台和文件。 JSON::null 也是如此.

关于json - 如何从 perl 脚本发送 boolean 值而不将它们转换为字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43867553/

相关文章:

arrays - 从 Bool 数组返回一个索引值数组,其中 true

android - 代码在 Jelly Beans 中不起作用

json - 使用 jQuery 和 REST/JSON 简化客户端模板框架

java - 在 json 数据中指定 float 的替代方法是什么?

perl - 文件句柄在 Perl 中无法正常工作

perl - 了解数组的数组

perl - "isn' t 数字 "error in "排序 "after "uniq"

json - 如何将结构作为参数传递给函数

java - 通过Java调用PL\SQL : Registering out parameter as boolean

c# - 正则表达式 c# 不应匹配 boolean 运算符