JSON按特定值排序-PERL

时间:2019-05-20 13:48:20

标签: json perl sorting

我有这个示例代码

#!/usr/bin/perl
use strict;
use warnings;
use JSON::PP qw( );
use Data::Dumper qw (Dumper);


my $json = JSON::PP->new()->pretty->utf8;       # lesbares JSON | Sort numerically
my %ORDER = (id => 1, name => 2);

 $json->sort_by(sub {
    ($ORDER{$JSON::PP::a} // 999) <=> ($ORDER{$JSON::PP::b} // 999)
    or $JSON::PP::a cmp $JSON::PP::b
});

print $json->encode(
[
    {name => 'ABS700', id => 0, data => [
            {
                dmsg => 's4F038300', state => 'T: 3.3', user => 'SD_Protocol'
            }
        ]
    },
    {name => 'GT-WT-02', id => 0, data => [
      {
                dmsg => 's5410AC5F9800', state => 'T: 17.2 H: 47', user => 'Ralf9'
      }
    ]
    },
    {name => 'NEU', id => 99, data => [
      {
                dmsg => 's5410AC5F9800', state => 'T: 17.2 H: 47', user => 'NEUER'
      }
    ]
    },
    {name => 'Ventus W132', id => 4, data => [
      {
                dmsg => 'sD66EE1603000', user1 => 'dirigent', comment => 'wind',
                readings => [{ state => 'windGuest: 1.2 winddir:0' }]
      }
    ]
    },
],
);

我想对它进行排序,使结尾带有“ id => 99”的值。

我可以对所有内部值进行任意排序,但是我需要进行新的外部排序。

我该如何解决这个问题?

1 个答案:

答案 0 :(得分:5)

->sort_by用于控制哈希元素的顺序。

您要控制数组元素的顺序。

对于数组,没有等效于->sort_by的机制,因为不需要数组。虽然您不能自然地控制哈希返回其元素的顺序,但是您自然可以控制数组返回其元素的顺序。

my $data = [ ... ];
@$data = sort { $a->{id} <=> $b->{id} } @$data;
print $json->encode($data);