我收到此错误
Argument "\\x{61}" isn't numeric in numeric comparison (<=>)
这
#!/usr/bin/perl
use JSON::PP;
use utf8;
use strict;
use warnings;
use Data::Dumper;
my $json = JSON::PP->new->allow_nonref;
$json = $json->utf8;
my $data = {
12 => {
a => 1,
b => 2,
},
1 => {
x => 3,
},
2 => {
z => 4,
}
};
my $json_string = $json->sort_by(sub { $JSON::PP::a <=> $JSON::PP::b })->encode($data);
假设将散列编码为json字符串,然后对键12
1
2
进行数字排序。
如果问题可以通过另一个JSON解析器解决,那么这将完全没问题=)
怎么了?
答案 0 :(得分:9)
如果您更喜欢数字排序但希望回退到词典排序,请使用此排序功能:
$json_string = $json->sort_by(
sub {
$JSON::PP::a <=> $JSON::PP::b
||
$JSON::PP::a cmp $JSON::PP::b
}
)->encode($data);
当排序键不是数字时,数字比较(<=>
)运算符将返回0,函数将执行词法比较(cmp
)运算。
<小时/>
编辑(上述解决方案仍然没有抑制警告)。需要进行一些调整来抑制警告。你可以说
sub {
no warnings 'numeric';
$JSON::PP::a <=> $JSON::PP::b || $JSON::PP::a cmp $JSON::PP::b
}
答案 1 :(得分:4)
由于aaa bbb a2
不是数字,因此您可能需要使用字典排序。
尝试将<=>
替换为cmp
:
$json_string = $json->sort_by(sub { $JSON::PP::a cmp $JSON::PP::b })->encode($data);