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

今天遇到一个需求,要求编码 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 可以解决你的问题

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 关于Mongodb的全面总结 MongoDB的内部构造《MongoDB The Definitive Guide》...
    中v中阅读 32,204评论 2 89
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 136,212评论 19 139
  • 1、通过CocoaPods安装项目名称项目信息 AFNetworking网络请求组件 FMDB本地数据库组件 SD...
    阳明AI阅读 16,060评论 3 119
  • 冰凉如水的夜空繁星点点, 犹如精美的礼服上耀眼夺目的宝石。 我站在天的这一边苦苦思念着你, 不知你是否 是否像我一...
    得我者幸阅读 3,483评论 1 4
  • 心流可以改变生活,需要我们不断的去练习。 有清晰的目标,并且需要挑战与能力对等就会产生心流,同时还需要投入专注力。...
    郝新晴阅读 1,229评论 0 1

友情链接更多精彩内容