Удаление данных в масоне / Perl и создание из них Json - PullRequest
0 голосов
/ 06 марта 2020

string s = "%7BparentAsin%3Aasin_1%2C+businessType%3A+%22AHS%22%2CrenderType%3ARenderAll%2Cconstraints%3A%5B%7Btype%3A+Delete%2CmutuallyInclusive%3Afalse%7D%5D%7D"

Я хочу, чтобы это было преобразовано в JSON на языке масонов. (Мейсон очень похож на perl).

Я делаю это, и это работает частично:

URI::Escape::uri_unescape($ItemAssociationGroupData)

Это возвращается:

{parentAsin:asin_1,+businessType:+"AHS",renderType:RenderAll,constraints:[{type:+Delete,mutuallyInclusive:false}]}

Здесь я не хочу, чтобы знаки «+» и конечный результат были Json, а не String. Как это может быть сделано онлайн с помощью этого инструмента, но я хочу сделать то же самое в коде.

https://www.url-encode-decode.com/

Я пытался: JSON::XS::to_json && HTML::Entities.. n все, но они не работают и возвращают неопределенные значения.

Любая помощь здесь приветствуется

Ответы [ 2 ]

1 голос
/ 06 марта 2020

Я не знаю, откуда вы берете эту строку, но на самом деле она не очень близка к JSON.

!/usr/bin/perl

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

use JSON;
use URI::Escape;
use Data::Dumper;

my $str = '%7BparentAsin%3Aasin_1%2C+businessType%3A+%22AHS%22%2CrenderType%3ARenderAll%2Cconstraints%3A%5B%7Btype%3A+Delete%2CmutuallyInclusive%3Afalse%7D%5D%7D';

my $json = uri_unescape($str);

say $json;

say Dumper decode_json($json);

Мы получаем такой вывод:

{parentAsin: asin_1, + businessType: + "AHS", renderType: RenderAll, ограничения: [{type: + Delete, взаимно включительно: false}]}

А затем эта ошибка:

'' 'ожидается со смещением символа 1 (перед "parentAsin: asin_1, + b ...") в строке 21 json_decode.

Это вызвано ключами в вашем объекты не в кавычках. Хорошо, мы можем это исправить. Мы также заменим знаки «+» пробелами.

#!/usr/bin/perl

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

use JSON;
use URI::Escape;
use Data::Dumper;

my $str = '%7BparentAsin%3Aasin_1%2C+businessType%3A+%22AHS%22%2CrenderType%3ARenderAll%2Cconstraints%3A%5B%7Btype%3A+Delete%2CmutuallyInclusive%3Afalse%7D%5D%7D';

# ADDED THIS LINE
$str =~ s/\+/ /g;

my $json = uri_unescape($str);

# ADDED THIS LINE
$json =~ s/(\w+?):/"$1":/g;

say $json;

say Dumper decode_json($json);

Теперь мы получим лучший вывод:

{"parentAsin": asin_1, "businessType": "AHS", "renderType": RenderAll, "constraints": [{"type": Delete, "mutuallyInclusive": false}]}

Но мы все равно получаем ошибку:

искаженная строка JSON, ни тега, ни массива, ни объекта, ни числа, ни строки, ни атома, со смещением символа 14 (перед "asin_1, +" businessTyp .. . ") в строке json_decode 21. * 1 028 *

Это потому, что ваши значения также должны быть в кавычках. Но исправить это сложнее, потому что некоторые из ваших значений уже заключены в кавычки (например, "AHS"), а некоторые значения не нужно заключать в кавычки (например, false).

Так что трудно понять лучший подход взять отсюда. Моим первым инстинктом было бы go вернуться к тому, что генерирует эту исходную строку, и посмотреть, можно ли исправить ошибки, чтобы получить правильную JSON строку.

1 голос
/ 06 марта 2020

Просто замените + пробелами.

uri_unescape( $ItemAssociationGroupData =~ s/\+/ /rg )

Это производит

{parentAsin:asin_1, businessType: "AHS",renderType:RenderAll,constraints:[{type: Delete,mutuallyInclusive:false}]}

Но эта строка не JSON. Ключи объектов должны быть строковыми литералами в JSON, а строковые литералы должны быть заключены в кавычки.

Cpanel :: JSON :: XS's allow_barekey заставит его принимать ключи без кавычек, но без JSON parser будет принимать другие строковые литералы без кавычек (asin_1, RenderAll, Delete). Даже JavaScript не примет это.

...