美文网首页
Perl 编码 JSON 时使用 canonical 进行排序

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

作者: 動感光波 | 来源:发表于2018-07-11 20:29 被阅读0次

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

    相关文章

      网友评论

          本文标题:Perl 编码 JSON 时使用 canonical 进行排序

          本文链接:https://www.haomeiwen.com/subject/uodkpftx.html