能否为Perl JSON::PP模块的encode_json函数设置canonical与allow_nonref属性?正确变量名是什么?
嘿,我来帮你理清这两个关于JSON::PP的问题~
1. 能不能通过设置包变量让encode_json输出按键排序的JSON?
完全可以!JSON::PP的函数式接口(比如encode_json)会读取对应的包变量来确定编码规则,只要正确设置控制排序的变量,就能让输出的JSON对象按键的字典序排列。
2. 哪种包变量写法能让encode_json启用canonical和allow_nonref?
写法一是正确的——也就是使用带P_前缀的变量:
$JSON::PP::P_CANONICAL = 1; $JSON::PP::P_ALLOW_NONREF = 1;
为什么写法二不行呢?因为不带P_前缀的$JSON::PP::canonical和$JSON::PP::allow_nonref,其实是JSON::PP对象实例的属性变量,直接设置它们并不会影响encode_json这种函数式接口的默认行为。
举个实际的验证例子:
use JSON::PP qw(encode_json); # 启用按键排序和允许非引用类型 $JSON::PP::P_CANONICAL = 1; $JSON::PP::P_ALLOW_NONREF = 1; my $test_hash = { z => 3, a => 1, m => 2 }; my $result = encode_json($test_hash); print $result; # 输出 {"a":1,"m":2,"z":3},严格按键排序
如果你用写法二设置变量,encode_json的输出还是会保持哈希原有的随机顺序,达不到你想要的效果。
另外提一句:之后如果想恢复默认行为,只要把这些变量设回0就可以啦。
内容的提问来源于stack exchange,提问作者user2784466
相关产品推荐
相关产品推荐

