Perl Json解析器,改变了json中元素的顺序

时间:2016-08-08 06:41:12

标签: json perl

我使用perl的json模块来解析json对象并更新它。

在更新json对象后,我们看到,json中元素的顺序发生了变化,我理解json中元素的顺序无关紧要。

但是想知道有没有一种方法可以保持与输入json对象相同的顺序?因为我们与许多客户端共享更新json,我担心是否有人正在使用解析器,其中元素的顺序是硬编码的。

1 个答案:

答案 0 :(得分:0)

您需要使用某种绑定哈希来强制执行密钥的顺序:Tie::IxHash

以下是概念证明:

#!/usr/bin/env perl

use strict;
use warnings;
use v5.10;

use JSON::XS;

my $JSON = JSON::XS->new->utf8->indent->space_after->convert_blessed;

my $data = {
    a => 1,
    b => 2,
    c => 3,
    d => 4,
    e => 5,
};

say $JSON->encode($data);      # Keys are unordered

bless $data, 'MyAlphaHash';

say $JSON->encode($data);      # Keys are alphabetized

package MyAlphaHash;

use Tie::IxHash;

sub TO_JSON {
    my $self = shift;

    tie my %hash, 'Tie::IxHash', %$self;

    tied(%hash)->Reorder( sort keys %hash );

    return \%hash;
}

输出:

$ perl ordered.pl
{
   "e": 5,
   "c": 3,
   "a": 1,
   "b": 2,
   "d": 4
}

{
   "a": 1,
   "b": 2,
   "c": 3,
   "d": 4,
   "e": 5
}