perl: как отсортировать структуру JSON по чему-то другому, кроме «корневых» ключевых атрибутов

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."
        }
}
8
задан knb 20 August 2010 в 14:55
поделиться

1 ответ

Я не уверен, что понимаю, как вы хотите, чтобы вывод 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);
14
ответ дан 5 December 2019 в 12:06
поделиться
Другие вопросы по тегам:

Похожие вопросы: