2017-08-29 102 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。