Perl 编码 JSON 时使用 canonical 进行排序

今天遇到一个需求,要求编码 JSON 时按照 Key 进行逆序排序
世界上最好的语言可以使用 krsort 对关联数组排序,然后 json_encode 解决这个问题

如:

 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 可以解决你的问题

你可能感兴趣的:(Perl 编码 JSON 时使用 canonical 进行排序)