Hash :: Ordered与Tie :: IxHash与JSON :: XS编码

use*_*329 7 perl hash json

我正在尝试Hash::Ordered而不是Tie::IxHash,因为它似乎更快.

虽然Tie::IxHash工作正常,但我遇到了一些问题Hash::Ordered.关键是要对哈希值进行排序(在Perl中通常是随机的).

use Hash::Ordered;
use JSON::XS;
use Data::Dumper;

use strict;
use warnings;

my $json = JSON::XS->new;

my $oh = Hash::Ordered->new;
$oh->push('result' => { 'counter' => "123" }, 'number' => { 'num' => '55' });

my @r = $oh->as_list;

$json->pretty(1);
my $jsondata = $json->encode(\@r);
print Dumper $jsondata;
Run Code Online (Sandbox Code Playgroud)

结果很奇怪:

 [
   "result",
   {
      "counter" : "123"
   },
   "number",
   {
      "num" : "55"
   }
]
Run Code Online (Sandbox Code Playgroud)

这是一个工作示例Tie::IxHash,我试着得到相同的结果Hash::Ordered.

use Data::Dumper;
use Tie::IxHash;
use JSON::XS;

use strict;
use warnings;

my $json = JSON::XS->new;

my %h;
tie(%h, 'Tie::IxHash', result => { counter => "123" }, number => { num => '55' });

  $json->pretty(1);
  my $pretty_json = $json->encode(\%h);

  print Dumper $pretty_json;
Run Code Online (Sandbox Code Playgroud)

产量

{
   "result" : {
      "counter" : "123"
   },
   "number" : {
      "num" : "55"
   }
}
Run Code Online (Sandbox Code Playgroud)

Bor*_*din 5

的面向对象接口Hash::Ordered比绑定接口快得多,但某些实用程序(例如$json->encode)需要真正的哈希引用

两全其美的方法是将哈希与这些实用程序结合使用,并用于tied提取底层Hash::Ordered对象,以便您可以使用更快的方法调用来操作它

这个简短的程序演示了。该代码唯一缓慢的部分是当哈希被传递到encode转换为 JSON 时。该push调用不使用绑定接口并且保持快速

use strict;
use warnings;

use Hash::Ordered;
use JSON::XS;

my $json = JSON::XS->new->pretty;

tie my %h, 'Hash::Ordered';
my $oh = tied %h;
$oh->push( result => { counter => 123 }, number => { num => 55 } );

print $json->encode(\%h), "\n";
Run Code Online (Sandbox Code Playgroud)

输出

{
   "result" : {
      "counter" : 123
   },
   "number" : {
      "num" : 55
   }
}
Run Code Online (Sandbox Code Playgroud)


Mig*_*Prz 3

使用Hash::Ordered 绑定接口

my $json = JSON::XS->new;

tie my %hash, "Hash::Ordered";

$hash{'result'} = { 'counter' => "123" };
$hash{'number1'} = { 'num' => '1' };
$hash{'number2'} = { 'num' => '2' };
$hash{'number3'} = { 'num' => '3' };
$hash{'last'} = { 'num' => 'last' };

$json->pretty(1);
my $jsondata = $json->encode(\%hash);
Run Code Online (Sandbox Code Playgroud)

你得到的JSON数据是:

{
   "result" : {
      "counter" : "123"
   },
   "number1" : {
      "num" : "1"
   },
   "number2" : {
      "num" : "2"
   },
   "number3" : {
      "num" : "3"
   },
   "last" : {
      "num" : "last"
   }
}
Run Code Online (Sandbox Code Playgroud)