string s = "%7BparentAsin%3Aasin_1%2C+businessType%3A+%22AHS%22%2CrenderType%3ARenderAll%2Cconstraints%3A%5B%7Btype%3A+Delete%2CmutuallyInclusive%3Afalse%7D%5D%7D"
我想把它转换成梅森语言的JSON。(Mason与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,但它们都不起作用,并返回未定义的值。
非常感谢您的帮助
只需将+
替换为空格。
uri_unescape( $ItemAssociationGroupData =~ s/+/ /rg )
产生
{parentAsin:asin_1, businessType: "AHS",renderType:RenderAll,constraints:[{type: Delete,mutuallyInclusive:false}]}
但该字符串不是JSON。对象的键必须是JSON中的字符串文字,并且字符串文字必须加引号。
Cpanel::JSON::XS的allow_barekey
选项将使其接受未引用的键,但没有JSON解析器会接受其他未引用的字符串文字(asin_1
、RenderAll
、Delete
(。甚至连JavaScript都不会接受这一点。
我不知道你从哪里得到这个字符串,但它并不是很接近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,constraints:[{type:+Delete,mutuallyInclusive:false}]}
然后这个错误:
应为'"',在json_decode第21行的字符偏移量1处(在"parentAsin:asin_1,+b…"之前(。
这是由于对象中的键不在带引号的字符串中造成的。好的,我们可以解决。我们还将用空格替换"+"符号。
#!/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字符串,既不是标记、数组、对象、数字、字符串,也不是原子,位于JSON_decode第21行的字符偏移量14处(在"asin_1,+"businessTyp…"之前(。
这是因为您的值也需要是带引号的字符串。但解决这个问题更困难,因为有些值已经被引用(例如"AHS"
(,而有些值不需要被引用(如false
(。
因此,很难知道从这里采取的最佳方法。我的第一直觉是回到生成原始字符串的地方,看看是否可以修复错误,从而获得正确的JSON字符串。