perl:处理来自 decode_json() 的错误 return 值
perl: processing bad return value from decode_json()
我正在尝试构建一个脚本来处理 joomla 文章中的 JSON 数据,但我不知道如何处理来自 decode_json 的失败 return 值() 函数。
这是我试图用来从本文中提取 "urls" JSON 数据的代码
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":""}
然后它就卡住了,而不是直接进入下一篇文章
, or } expected while parsing object/hash, at character offset 89 (before "mailto:ben@example...") at ./find-remote-links.pl line 271.
发生错误时,如何让程序继续执行下一行(而不是终止)?
要捕获异常,可以使用 eval BLOCK
。
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;
}
亚历克斯,
您的问题源于 JSON 部分 "urlatext":"</i>Posted by: <a href="mailto:ben@example.com">Benjamin D.</a>"
。 JSON 确实假定格式应该是 "key": "value"
并且 value 确实 不允许 包含 "
而不转义.
你需要分析这些额外的"
来自哪里
- 如果您的代码引入了额外的
"
,那么您需要更正这部分代码
- 如果额外的
"
来自提取片段,那么您需要找到一种替代方法
它到 \"
或 '
.
在 2 的情况下,如果此提取片段是一致的(可预测的),那么您可以使用 regex 更正它。
如果提取片段非常动态且无法预测,那么您必须编写一个 解析器 以优雅地处理至少已知的情况。
我正在尝试构建一个脚本来处理 joomla 文章中的 JSON 数据,但我不知道如何处理来自 decode_json 的失败 return 值() 函数。
这是我试图用来从本文中提取 "urls" JSON 数据的代码
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":""}
然后它就卡住了,而不是直接进入下一篇文章
, or } expected while parsing object/hash, at character offset 89 (before "mailto:ben@example...") at ./find-remote-links.pl line 271.
发生错误时,如何让程序继续执行下一行(而不是终止)?
要捕获异常,可以使用 eval BLOCK
。
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;
}
亚历克斯,
您的问题源于 JSON 部分 "urlatext":"</i>Posted by: <a href="mailto:ben@example.com">Benjamin D.</a>"
。 JSON 确实假定格式应该是 "key": "value"
并且 value 确实 不允许 包含 "
而不转义.
你需要分析这些额外的"
来自哪里
- 如果您的代码引入了额外的
"
,那么您需要更正这部分代码 - 如果额外的
"
来自提取片段,那么您需要找到一种替代方法 它到\"
或'
.
在 2 的情况下,如果此提取片段是一致的(可预测的),那么您可以使用 regex 更正它。
如果提取片段非常动态且无法预测,那么您必须编写一个 解析器 以优雅地处理至少已知的情况。