在json对象之后从Json File中读取垃圾

时间:2015-08-11 10:29:04

标签: json perl

我在Perl程序中使用json文件。我无法解析json文件。

出现以下错误:

print "input json";
open(my $f, "<", "$ARGV[1]");
my $content=<$f>;
my $structured;
eval {
$structured = from_json($content, {utf8 => 1});
};

if ($@) {
   $content =~ s/\n/ /g;
   my $errMsg = $@;
   $errMsg =~ s/\n/ /g;
   WriteInfo("Unparseable result for url=$url, error: $errMsg\n") ;
};

以下是代码:

{{1}}

如何解决此错误?

1 个答案:

答案 0 :(得分:4)

  

如何解决此错误?

您无法自动修复JSON数据。可能有许多修复&#34;这将通过解析器获取数据,但可能很难分辨哪些是正确的。您应该与数据来源交谈,并要求提供正确的版本

可以手动修复数据,但只有在没有正确版本的数据时才应尝试此操作。手动查找2.2MB +文本文件中的错误并不是一件容易的事,并且字符位置2326471只是解析器找到错误的地方,而不是应该进行更正的地方

  

JSON对象后的垃圾...

这意味着from_json找到了JSON数据的结尾 - 即最后的右括号}或括号] - 但是在该字符后面的字符串中有数据。可能是文件已正确写入,但在JSON结束后确实存在虚假数据。如果是这样,那么只需检查数据文件

即可

注意

除非您重新定义了$/变量,否则这些行

open(my $f, "<", "$ARGV[1]");
my $content = <$f>;

只会将文件的第一行读入$content。可能是该文件只包含一个非常长的tex行(即它不包含换行符)但在错误处理程序中包含此行

$content =~ s/\n/ /g;

暗示其中的换行符。

只读取多行JSON文件的第一行不会导致您看到的错误,但最好将整个文件读入内存,然后再将其解码为JSON数据,如果意外的换行已经进入数据

这是编写代码段的更好方法

print "Input JSON\n";

my $content - do {
    open my $fh, '<', $ARGV[1] or die qq{Unable to open "$ARGV[1]" for input: $!};
    local $/;
    <$fh>;
};


my $structured = eval {
    from_json( $content, {utf8 => 1} );
};

if ( my $err_msg = $@ ) {

   $content =~ tr/\n/ /;
   $err_msg =~ tr/\n/ /;

   WriteInfo("Unparsable result for URL=$url, error: $err_msg\n") ;
};