Ключи Perl json с пробелами

как я могу разобрать объект perl json, в ключах которого есть пробелы

{
   "abc" : [
       "lmn" : {
          "Ab Cd" : "Xy Zw",
          "Ef Gh" : "Pq Rs",
       }
   ]
}

person Alter16    schedule 05.03.2020    source источник
comment
Вы можете сделать это с помощью регулярного выражения. Но я не думаю, что регулярное выражение - правильный инструмент. Для этого должны быть лучшие библиотеки и инструменты.   -  person BitBeats    schedule 05.03.2020
comment
Отвечает ли это на ваш вопрос? Какой модуль Perl вы бы порекомендовали для манипулирования JSON?   -  person snipsnipsnip    schedule 05.03.2020
comment
это недопустимый JSON; после "Pq Rs" не должно быть запятой   -  person ysth    schedule 05.03.2020
comment
Пожалуйста, проверьте   -  person ssr1012    schedule 05.03.2020
comment
@ ssr1012 это для JS, а не для PERL   -  person Alter16    schedule 05.03.2020


Ответы (2)


По определению, JSON анализируется с помощью парсера JSON. В CPAN существует несколько парсеров JSON, включая Cpanel::JSON::XS. . Он без проблем обрабатывает ключи с пробелами, как и любой другой парсер JSON.

Обратите внимание, что у вас есть не JSON. Я предполагаю, что ошибки являются опечатками, поскольку вы спросили о JSON.

person ikegami    schedule 05.03.2020
comment
XS может сделать эту работу, но возможно ли это с PP?? (эта запятая опечатка) - person Alter16; 05.03.2020
comment
Намного медленнее, но да - person ikegami; 05.03.2020
comment
Можете ли вы рассказать мне, как, потому что $VAR1 -> {abc} -> {lmn} -> {Ab Cd} это дало мне не удается найти метод объекта Ab через пакет Cd - person Alter16; 06.03.2020
comment
@ Alter16, $VAR1 -> {abc} -> {lmn} -> {Ab Cd} должно быть $VAR1 -> {abc} -> {lmn} -> {'Ab Cd'}. Вы можете опустить кавычки вокруг ключевого выражения, только если это слово. - person ikegami; 06.03.2020
comment
Yessss для «Ab Cd», я получил ошибку использования неинициализированного значения - person Alter16; 06.03.2020
comment
Вы получаете эту ошибку, когда у вас есть undef, что может быть связано с тем, что у вас есть null в JSON, или потому что вы ссылаетесь на несуществующий массив или хэш-элемент. - person ikegami; 06.03.2020

Пробелы в ключе не представляют проблем для любого парсера JSON.

Однако в вашем JSON есть две проблемы, которые вызовут проблемы для любого парсера. Другие заметили лишнюю запятую после "Pq Rs", но у вас также есть массив, содержащий пару ключ/значение (с ключом "lnm"), которая должна находиться внутри объекта.

Первоначально я просто удалил запятую и запустил этот код:

#!/usr/bin/perl

use strict;
use warnings;
use feature 'say';

use Data::Dumper;
use JSON;

my $json = '{
   "abc" : [
       "lmn" : {
          "Ab Cd" : "Xy Zw",
          "Ef Gh" : "Pq Rs"
       }
   ] 
}';

my $data = decode_json($json);

say Dumper $data;

Это дает ошибку:

, или ] ожидается при синтаксическом анализе массива по смещению 28 символов (перед ": {\n "Ab C...")

Я исправил это, вставив { ... } вокруг объекта lnm.

#!/usr/bin/perl

use strict;
use warnings;
use feature 'say';

use Data::Dumper;
use JSON;

my $json = '{
   "abc" : [ {
       "lmn" : {
          "Ab Cd" : "Xy Zw",
          "Ef Gh" : "Pq Rs"
       }
   } ] 
}';

my $data = decode_json($json);

say Dumper $data;

И тогда я получил этот вывод:

$VAR1 = {
          'abc' => [
                     {
                       'lmn' => {
                                  'Ab Cd' => 'Xy Zw',
                                  'Ef Gh' => 'Pq Rs'
                                }
                     }
                   ]
        };

Чего, я думаю, вы и ожидаете.

person Dave Cross    schedule 05.03.2020
comment
Спасибо за ваше полезное наблюдение, но у меня возникла проблема при получении значения для $VAR1 -> {abc} -> {lmn} -> {'Ab Cd'} - person Alter16; 05.03.2020
comment
@ Alter16: Что означает «У меня возникла проблема»? Это не очень ясно. Пожалуйста, добавьте детали к вашему вопросу. - person Dave Cross; 05.03.2020