我将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));
Run Code Online (Sandbox Code Playgroud)
这一切都很好.
最近,另一个开发人员进行了很少的输入参数验证检查,REST严格接受布尔值,没有引号.
我现在需要发送我的输入
$data = '["inout1":true]'
$client = REST::Client->new();
$client->POST($url,($data,$headers));
Run Code Online (Sandbox Code Playgroud)
我的所有脚本都失败了,因为输入数据使用encode_json函数编码为JSON格式.
我可以手动形成JSON数据,但输入数据有时会非常庞大.无法识别它们并随时修改.
有没有办法可以实现没有引号的传递布尔值?
sim*_*que 15
直接在Perl中使用true和false语法错误是use strict因为不允许使用裸词.
我猜你使用的是JSON或JSON :: XS.那些使用标量引用来表示TRUE和FALSE.具体来说,\1和\0.
$data = ( input1 => \1 );
Run Code Online (Sandbox Code Playgroud)
这是来自JSON :: XS的相关文档,它允许Types :: Serializer :: True和Types :: Serializer :: False:
来自Types :: Serialiser模块的这些特殊值分别变为JSON true和JSON false值.您也可以使用
\1和\0直接,如果你想要的.
而从JSON的文档,其中JSON::true并JSON::false也可用于:
这些特殊值分别变为JSON true和JSON false值.您也可以使用
\1和\0直接,如果你想要的.
如果你坚持true不使用引号my $foo = true,你可以制作返回\1和的子或常量(实际上是子)\0.
use constant false => \0;
sub true () { return \1 } # note the empty prototype
$data = ( input1 => true, input2 => false );
Run Code Online (Sandbox Code Playgroud)
正如Sinan在他的评论中指出的那样,使用常量更快,除非你包含一个空原型(()在子定义中),因为这样Perl可以内联调用.
但在我看来,这不仅仅是简单地使用参考文献.总是想想下一个处理这段代码的人.