2017-08-29 85 views
0

我想解析一个用Perl编写的utf-8 json文件。 https://jsonlint.com/表示json有效。 不过我得到的错误消息:用Perl解析utf-8 json文件

畸形JSON字符串,既不标签,数组,对象,数字,字符串或原子,在字符偏移0(前“\ X {EF} \ X {BB} \ X在parse.pl线{BF} { “...”)15.

的代码是:

use strict; 
use utf8; 
use JSON qw(); 

my $filename = 'k2.json'; 

my $json_text = do { 
    open(my $json_fh, $filename) or die("Can't open $filename: $!\n"); 
    local $/; 
    <$json_fh> 
}; 

my $json = JSON->new; 
my $data = $json->decode($json_text); 

for (@{$data->{data}}) { 
    print $_->{lng}."\n"; 
} 

的UTF-8编码的JSON是:

{"data": 
[{"lng":"19.03252602", 
"lat":"47.49795914", 
"display_name":"I. kerület (Attila út)", 
"active":"1", 
"url":"/hu/kormanyablakok/budapest/i-kerulet/i-kerulet-attila-ut/283" 
}] 
} 

我看到(ef,bb,bf)是三个字节,表明它是一个utf-8文档,所以我不明白在这里丢失了什么JSON包。我怎样才能使它工作?
指定“<:编码(UTF-8)”在打开文件并没有帮助...

回答

2

JSON不指望输入有字节顺序标记。在运行JSON解码器之前将其剥离。

$json_text =~ s/^[^\x00-\x7f]+//; 
my $data = $json->decode($json_text); 

字节顺序标记未粘贴到JSONlint,因此JSONlint没有评估您拥有的同一文档。

+0

另请参阅[File :: BOM](https://metacpan.org/pod/File::BOM)。 –

0
use strict; 
use warnings qw(all); 
use utf8; 
use open ':std', ':encoding(UTF-8)'; 
use feature qw(say); 

use JSON qw(); 

my $filename = 'k2.json'; 

my $json_text = do { 
    open(my $json_fh, '<', $filename) 
     or die("Can't open $filename: $!\n"); 

    local $/; 
    <$json_fh> 
}; 

$json_text =~ s/^\N{BOM}//; 

my $data = JSON->new->decode($json_text); 

say $_->{lng} for @{ $data->{data} }; 

use strict; 
use warnings qw(all); 
use utf8; 
use open ':std', ':encoding(UTF-8)'; 
use feature qw(say); 

use File::BOM qw(open_bom); 
use JSON  qw(); 

my $filename = 'k2.json'; 

my $json_text = do { 
    open_bom(my $fh, $file, ':encoding(UTF-8)') 
     or die("Can't open $filename: $!\n"); 

    local $/; 
    <$json_fh> 
}; 

my $data = JSON->new->decode($json_text); 

say $_->{lng} for @{ $data->{data} }; 

注:

  • use open ':std', ':encoding(UTF-8)';原因打印STDOUT使用UTF-8来编码。在您的示例中将需要打印display_name

    它还设置用于解码第一个片段中的JSON文件的默认编码。

  • 我留在use utf8;,但它没有做任何事情,因为源代码完全是ASCII。