为什么会出现此错误?

时间:2011-06-06 17:33:50

标签: perl json

我收到此错误

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解析器解决,那么这将完全没问题=)

怎么了?

2 个答案:

答案 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);