Я не знаю, откуда вы берете эту строку, но на самом деле она не очень близка к 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 строку.