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 确实 不允许 包含 " 而不转义.

你需要分析这些额外的"来自哪里

  1. 如果您的代码引入了额外的 ",那么您需要更正这部分代码
  2. 如果额外的 " 来自提取片段,那么您需要找到一种替代方法 它到 \"'.

2 的情况下,如果此提取片段是一致的(可预测的),那么您可以使用 regex 更正它。

如果提取片段非常动态且无法预测,那么您必须编写一个 解析器 以优雅地处理至少已知的情况。