2017-08-29 2 views
0

Ich versuche, eine utf-8 JSON-Datei in Perl zu analysieren. https://jsonlint.com/ sagt der JSON ist gültig. Noch erhalte die Fehlermeldung:Parsing utf-8 Json mit Perl

malformed JSON Zeichenfolge weder tag, array, Objekt, Zahl, eine Zeichenfolge oder ein Atom, bei dem Charakter Offset 0 (vor dem „\ x {ef} \ x {bb} \ x bf {} { "...") bei parse.pl Leitung 15.

Der Code ist:

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

den UTF-8 codiert json ist:

{"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" 
}] 
} 

Ich sehe, dass (ef, bb, bf) sind die drei Bytes, die darauf hindeuten, dass es ein utf-8-Dokument ist, so verstehe ich nicht, was JSON-Paket hier fehlt. Wie kann ich es zum Laufen bringen?
Angeben „<: Codierung (UTF-8)“ auf die Datei nicht auch nicht öffnen helfen ...

Antwort

2

JSON nicht Eingang die Bytereihenfolgemarkierung hat nicht erwartet. Entfernen Sie es, bevor Sie den JSON-Decoder ausführen.

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

Die Marke Byte-Reihenfolge wurde JSONlint nicht eingefügt, so JSONlint nicht das gleiche Dokument Auswertung wurde die Sie haben.

+0

Siehe auch [Datei :: 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} }; 

oder

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

Anmerkungen:

  • use open ':std', ':encoding(UTF-8)'; Ursachen STDOUT Drucken mit 8 UTF-kodieren. Dies wird benötigt, um die display_name in Ihrem Beispiel zu drucken.

    Es legt auch die Standardcodierung fest, die zum Dekodieren der JSON-Datei im ersten Snippet verwendet wird.

  • Ich verließ in use utf8;, aber es tut nichts, da der Quellcode vollständig ASCII ist.