今天遇到一个需求,要求编码 JSON 时按照 Key
进行逆序排序
世界上最好的语言可以使用 krsort
对关联数组排序,然后 json_encode 解决这个问题
如:
<?php
$body = array("y" => 1,"j" => 1,"c" => 1,"a"=> 1,"z" => 1);
krsort($body);
$json_body = json_encode($body,JSON_NUMERIC_CHECK);
echo $json_body;
?>
$ php json.php
{"z":1,"y":1,"j":1,"c":1,"a":1}
世界上最好的语言果然犀利 😱
那么 Perl 能否解决这个问题呢? 答案是肯定的!!!😊
Perl 的哈希在内存中是无序存放的,因此每次编码 JSON 时尽管键相同也可能得到不同的字符串
JSON.pm 提供了 canonical
方法来规范 JSON 的排序问题
开启排序(正序)
use strict;
use JSON;
my $json = JSON->new->canonical(1);
正序示例
use strict;
use JSON;
my $body = {y => 1,j => 1,c => 1,a => 1,z => 1};
my $json = new JSON;
$json->canonical(1);
print $json->encode($body);
$ perl json.pl
{"a":1,"c":1,"j":1,"y":1,"z":1}
逆序示例
use strict;
use JSON;
my $body = {y => 1,j => 1,c => 1,a => 1,z => 1};
my $json = new JSON;
$json->canonical(1);
$json->sort_by(sub { lc $JSON::PP::b cmp lc $JSON::PP::a });
print $json->encode($body);
$ perl json.pl
{"z":1,"y":1,"j":1,"c":1,"a":1}
开启 Canonical 可以保证始终通过键顺序排序
如果你希望每次编码的 JSON 字符串可预测,那么 Canonical JSON 可以解决你的问题