Преобразуйте ассоциативный массив Perl в JSON и прочитайте его в переполнении стека

Я пытаюсь прочитать ассоциативный массив Perl в моем сценарии PHP. Для этого сначала я пытаюсь преобразовать Perl-хэш в JSON с помощью модуля JSON.

Ниже приведен скрипт на Perl, который я использую для преобразования ассоциативного массива в JSON. Файл toc.pl имеет ассоциативный массив «asc_array».

use JSON;
$j = new JSON;

require'toc.pl';

print encode_json \%asc_array;

Asc_array выглядит как

%asc_array  = (
"1"            => 'Introduction',
"1.1"          => 'Scope',
"1.2"          => 'Purpose',
"2"            => 'Terminology',
"2.1"          => 'Definitions',
"2.2"          => 'Service Primitives',
"2.3"          => 'Abbreviations',
"2.4"          => 'Acronyms',
);

Здесь я сталкиваюсь с проблемой, которая заключается в том, что после преобразования ее в JSON меняется порядок элементов ассоциативного массива.

Поэтому мой вопрос: как я могу сохранить порядок элементов даже после преобразования его в JSON?

И после преобразования в JSON я читаю сценарий JSON in PHP.

Есть ли лучший способ прочитать ассоциативный массив Perl в сценарии PHP?

2

Решение

использование JSON->canonical сортировать ключи

use JSON;

my %asc_array = (
"1"   => 'Introduction',
"1.1" => 'Scope',
"1.2" => 'Purpose',
"2"   => 'Terminology',
"2.1" => 'Definitions',
"2.2" => 'Service Primitives',
"2.3" => 'Abbreviations',
"2.4" => 'Acronyms',
);

print JSON->new->canonical(1)->encode( \%asc_array ), "\n";

Выход:

{"1":"Introduction","1.1":"Scope","1.2":"Purpose","2":"Terminology","2.1":"Definitions","2.2":"Service Primitives","2.3":"Abbreviations","2.4":"Acronyms"}
2

Другие решения

Поскольку ваши хеш-ключи легко сортируются, почему бы просто не отсортировать данные после их получения скриптом PHP?

то есть

use JSON::PP;
my %asc_array  = (
"1"    => 'Introduction',
"1.1"  => 'Scope',
"1.2"  => 'Purpose',
"2"    => 'Terminology',
"2.1"  => 'Definitions',
"2.2"  => 'Service Primitives',
"2.3"  => 'Abbreviations',
"2.4"  => 'Acronyms',
);

my $json = JSON::PP->new;
print $json->encode(\%asc_array);

Затем в вашем PHP-скрипте:

# replace this with whatever method you're using to get your JSON
# I've jumbled up the order to demonstrate the power of sorting.
$json = '{"2.3":"Abbreviations", "2.1":"Definitions", "1":"Introduction", "2.4":"Acronyms", "1.1":"Scope", "2":"Terminology", "2.2":"Service Primitives", "1.2":"Purpose"}';

$decoded = json_decode( $json, true );
ksort($decoded);

print_r($decoded);

Выход:

Array
(
[1] => Introduction
[1.1] => Scope
[1.2] => Purpose
[2] => Terminology
[2.1] => Definitions
[2.2] => Service Primitives
[2.3] => Abbreviations
[2.4] => Acronyms
)
1

По вопросам рекламы [email protected]