我正在尝试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)
的面向对象接口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)
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)
归档时间: |
|
查看次数: |
493 次 |
最近记录: |