perl:处理decode_json()的错误返回值
我正试图构建一个脚本来处理joomla文章中的JSON数据,但我不知道如何处理decode_JSON()函数返回的失败值 下面是我试图用来从本文中提取“URL”JSON数据的代码perl:处理decode_json()的错误返回值,json,perl,parsing,joomla,Json,Perl,Parsing,Joomla,我正试图构建一个脚本来处理joomla文章中的JSON数据,但我不知道如何处理decode_JSON()函数返回的失败值 下面是我试图用来从本文中提取“URL”JSON数据的代码 my @rv = (); while (my $ref = $sth->fetchrow_hashref()) { print "urls: $ref->{'urls'}\n"; my $decoded_urls = decode_json($ref->{'urls'
my @rv = ();
while (my $ref = $sth->fetchrow_hashref()) {
print "urls: $ref->{'urls'}\n";
my $decoded_urls = decode_json($ref->{'urls'}) or next;
my $url = $decoded_urls->{'urla'};
if ($url ne 0) {
push @rv, $ref;
}
}
这将打印以下内容
urls: {"urla":"http://www.MimeStar.com/html/press_rel.htm","urlatext":"</i>Posted by: <a href="mailto:ben@example.com">Benjamin D.</a>","targeta":"1","urlb":false,"urlbtext":"","targetb":"","urlc":false,"urlctext":"","targetc":""}
当出现错误时,如何让程序继续下一行(而不是终止)?要捕获预期,可以使用
为了抓住一个期待,一个人使用 亚历克斯 您的问题源于以下JSON部分“urlatext”:“发布者:”。JSON确实假定格式应该是
“key”:“value”
,value不允许包含“
,而不转义
您需要分析这些额外的“
来自何处
“
,则需要更正这部分代码“
来自提取代码片段,那个么您需要找到一种替代方法
将其发送到\“
或”
“urlatext”:“发布者:”
。JSON假定格式应为“键”:“值”
,值不允许在不转义的情况下包含“
”
您需要分析这些额外的“
来自何处
“
,则需要更正这部分代码“
来自提取代码片段,那个么您需要找到一种替代方法
将其发送到\“
或”
如果提取片段非常动态且无法预测,则必须编写解析器,以优雅地处理至少已知的情况。urlatext属性具有嵌入引号。要使此json有效,需要对其进行转义。顺便说一句,
{“urla”:“…”,“urlb”:“…”,“urlc”:“…”,…}
是传递URL列表的可怕方式<代码>[“…”、“…”、“…”、“…]”、“…]”更有意义。如果你在这件事上有任何控制权,你应该解决这个问题。是的,很抱歉我没有说得更清楚。我试图找出如何处理异常。“urla”“urlb”直接来自joomla,不是我写的东西。urlatext
属性中嵌入了引号。要使此json有效,需要对其进行转义。顺便说一句,{“urla”:“…”,“urlb”:“…”,“urlc”:“…”,…}
是传递URL列表的可怕方式<代码>[“…”、“…”、“…”、“…]”、“…]”更有意义。如果你在这件事上有任何控制权,你应该解决这个问题。是的,很抱歉我没有说得更清楚。我试图找出如何处理异常。“urla”“urlb”直接来自joomla,不是我写的东西。我如何确定哪些$row的格式不正确,或者如果它们的格式不正确,甚至只打印它们而不尝试解码它们?我发现有很多格式不正确的字段,我想调查一下原因。@AlexRegan Perl中预期的编码-JSON
是对复杂数据结构的引用。您可以使用编写的许多模块中的一个来打印数据,比如核心data::Dumper
。例如,my decoded_url=eval{decode_json($row->{url})或执行{print“eval:$@”;说“json:”,pp$row->{url};next}代码>(使用使用数据::Dump qw(pp);
)。有关$@
,请参见链接的eval
。检查Perl数据结构是否具有有效的JSON的最佳方法是尝试对其进行解码(或者您需要仔细检查打印输出),因为“0”现在是一个有效的JSON文档,我将在eval中进行赋值,并在成功时强制eval返回1:my$decoded\u url;eval{$decoded_url=decode_json($row->{url});1}或下一个
或更好的用法:使用语法::关键字::Try;我的$decoded_URL;尝试{$decoded_url=decode_json($row->{url});}catch{next}
如何确定哪些$row的格式不正确,或者如果格式不正确,甚至只打印它们而不尝试解码?我发现有很多格式不正确的字段,我想调查一下原因。@AlexRegan Perl中预期的编码-JSON
是对复杂数据结构的引用。您可以使用编写的许多模块中的一个来打印数据,比如核心data::Dumper
。例如,my decoded_url=eval{decode_json($row->{url})或执行{print“eval:$@”;说“json:”,pp$row->{url};next}代码>(使用使用数据::Dump qw(pp);
)。有关$@
,请参见链接的eval
。检查Perl数据结构是否具有有效的JSON的最佳方法是尝试对其进行解码(或者您需要仔细检查打印输出),因为“0”现在是一个有效的JSON文档,我将在eval中进行赋值,并在成功时强制eval返回1:my$decoded\u url;eval{$decoded_url=decode_json($row->{url});1}或下一个
或更好的用法:使用语法::关键字::Try;我的$decoded_URL;尝试{$decoded_url=decode_json($row->{url});}捕获{next}
, or } expected while parsing object/hash, at character offset 89 (before "mailto:ben@example...") at ./find-remote-links.pl line 271.
my @rv;
while ( my $row = $sth->fetchrow_hashref() ) {
print "urls: $row->{urls}\n";
my $decoded_urls = eval { decode_json($row->{urls}) }
or next;
$decoded_urls->{urla}
or next;
push @rv, $row;
}