今天遇到一個需求卡者,要求編碼 JSON 時按照 Key
進(jìn)行逆序排序
世界上最好的語言可以使用 krsort
對關(guān)聯(lián)數(shù)組排序,然后 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 能否解決這個問題呢客们? 答案是肯定的3缇觥!底挫!??
Perl 的哈希在內(nèi)存中是無序存放的恒傻,因此每次編碼 JSON 時盡管鍵相同也可能得到不同的字符串
JSON.pm 提供了 canonical
方法來規(guī)范 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 字符串可預(yù)測,那么 Canonical JSON 可以解決你的問題