在mason/Perl中解开数据的标题并创建一个Json



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_1RenderAllDelete(。甚至连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字符串。

相关内容

  • 没有找到相关文章

最新更新