Perl: Как я могу отсортировать сложную структуру с помощью JSON: : PP?
Из документации JSON:
Поскольку процедура сортировки выполняется в области JSON :: PP, имя данной подпрограммы и специальные переменные $ a, $ b начнется с 'JSON :: PP ::'.
Вот моя попытка, похоже, не работает
open my $fh, ">", $file or warn " exportAsJSON: can't open file: '$file': $!";
print $fh $coder->sort_by(sub {$_->{column_def}->{$JSON::PP::a} cmp $_->{column_def}->{$JSON::PP::b} } )->encode(\%json);
close $fh;
Я хочу отсортировать по ключу, затем атрибуту column_def в ключе атрибута ниже column_def, то есть density, depth_in_m, mag_sus {{1 }}:
{
"column_def":
{
"depth_in_m":
{
"names":"depth_in_m",
"pos":"0"
},
"mag_sus":
{
"names":
{
"A_ALIAS":"Mag-Sus.",
"A_DESC":"magnetic susceptibility in SI",
"ATTRIBUTE":"MAG_SUS"
},
"pos":"2"
},
"density":
{
"names":
{
"A_ALIAS":"Density",
"A_DESC":"density in gm\/cc",
"ATTRIBUTE":"DENSITY"
},
"pos":"1"
}
},
"data":
{
"depth_in_m":"14.635",
"mag_sus":"n.a.",
"density":"n.a."
}
}
Я не уверен, что понимаю, как вы хотите, чтобы вывод JSON был отсортирован - кроме сортировки по ключу хэша. Если это все, что вам нужно, просто передайте методу canonical
аргумент true.
use strict;
use warnings;
use JSON::PP;
# A simple hash-of-hashes for exploration.
my $h = {
Z => { c => 1, d => 2 },
A => { a => 3, r => 4 },
B => { c => 5, x => 6 },
S => { q => 7, d => 8 },
};
my $js = JSON::PP->new;
$js->canonical(1);
my $output = $js->encode($h);
print $output;
Если вы используете метод sort_by
, не имеет смысла использовать $_
внутри блока sort
: что он будет представлять? Из документации не было понятно, какие аргументы получит код sort_by
. Используя Data::Dumper
вот так:
use Data::Dumper qw(Dumper);
my $sorter = sub {
# See what's going on.
print "$JSON::PP::a cmp $JSON::PP::b\n";
print Dumper(\@_, $_);
<STDIN>;
# Sort hash keys alphabetically.
$JSON::PP::a cmp $JSON::PP::b;
};
my $output = $js->sort_by($sorter)->encode($h);
Можно сделать вывод, что sort_by
работает следующим образом: (1) он получает два аргумента, JSON::PP
объект и хэш-реф, с которым в данный момент ведется работа; и (2) переменные $JSON::PP::a
и $JSON::PP::b
содержат сравниваемые хэш-ключи. Но обратите внимание, что ссылка на хэш относится к выводу JSON в процессе его построения от узлов листа вверх. Он не относится к вашей исходной структуре данных. Это, по-видимому, сделает задачу написания компаратора немного сложнее. Удачи.
my $sorter = sub {
my ($json_pp_object, $hash_ref) = @_;
# Write your own comparator here.
};
my $output = $js->sort_by($sorter)->encode($h);