perl:处理decode_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'

我正试图构建一个脚本来处理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'}) 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不允许包含
,而不转义

您需要分析这些额外的
来自何处

  • 如果代码引入了额外的
    ,则需要更正这部分代码
  • 若额外的
    来自提取代码片段,那个么您需要找到一种替代方法 将其发送到
    \“
  • 在案例2中,如果此提取片段是一致的(可预测的),则可以使用进行更正

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

    您的问题来自以下JSON部分
    “urlatext”:“发布者:”
    。JSON假定格式应为
    “键”:“值”
    不允许在不转义的情况下包含

    您需要分析这些额外的
    来自何处

  • 如果代码引入了额外的
    ,则需要更正这部分代码
  • 若额外的
    来自提取代码片段,那个么您需要找到一种替代方法 将其发送到
    \“
  • 在案例2中,如果此提取片段是一致的(可预测的),则可以使用进行更正


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

    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;
      }