2011-11-22 12 views
6

Mam problem z analizą obiektu JSON za pomocą języka Perl i nie wiem, czy problem pochodzi z jsona czy z mojego skryptu. Oto json:źle sformatowany ciąg znaków JSON, ani tablica, obiekt, liczba, ciąg ani atom

test.json

{ 
    "count":3, 
    "entries": 
    [ 
     { 
     "id":85, 
     "application":AuditExampleLogin1, 
     "user":admin, 
     "time":"2011-11-22T10:29:37.422Z", 
     "values": 
null 
     }, 
     { 
     "id":87, 
     "application":AuditExampleLogin1, 
     "user":admin, 
     "time":"2011-11-22T10:30:56.235Z", 
     "values": 
null 
     }, 
     { 
     "id":89, 
     "application":AuditExampleLogin1, 
     "user":admin, 
     "time":"2011-11-22T10:33:15.000Z", 
     "values": 
null 
     } 
    ] 
} 

tutaj skrypt:
script.pl

#!/usr/bin/perl -w 
use strict; 
use JSON; 
open FILE, 'test.json' or die "Could not open file inputfile: $!"; 
sysread(FILE, my $result, -s FILE); 
close FILE or die "Could not close file: $!"; 
my @json = @{decode_json($result)}; 

I wreszcie błąd Dostaję:
error

malformed JSON string, neither array, object, number, string or atom, 
at character offset 86 (before "AuditExampleLogin1,\n...") at  
./script.pl line 7. 

P: Czy ktoś może mi powiedzieć, czy problem pochodzi z jsona, czy z mojego skryptu i co należy zmienić w obu przypadkach?

FYI the json is coming from Alfresco auditing api.

+3

AFAIK to nie jest ważne JSON, brakujące cudzysłowy wokół wartości. – Mat

+0

Miałem do czynienia z dokładnie tym samym problemem. Mam pytanie do autora wątku: w jaki sposób uzyskujesz dostęp do zmiennych @json? Ciągle dostaję, że @json jest HASH w pamięci, ale nie mam dostępu do zmiennych lub pętli przez to. –

Odpowiedz

2

Działa, jeśli wartości Audit ... i admin są podane. Linia

my @json = @{decode_json($result)}; 

musi być tylko

my @json = decode_json($result); 
+0

rzeczywiście działa, gdy cytowane są wartości 'application' i' user'. Czy istnieje sposób, aby powiedzieć, że 'perl' jest nieco bardziej luźny podczas analizowania JSON i akceptowania niecytowanych ciągów znaków? (które uratowałoby mnie przed przepisaniem jsona). – Max

+1

Nie jestem pewien, autor modułu JSON uważa ścisłe sprawdzanie za funkcję bezpieczeństwa. Możesz szturchnąć kod, JSON :: PP jest czystą wersją perla. –

+5

Pytasz parser JSON, aby pomyślnie przeanalizować dane, które nie są poprawne JSON. W ten sposób leży szaleństwo, na pewno :) –

10

to:

"application":AuditExampleLogin1, 

... jest nieprawidłowy JSON. AuditExampleLogin1 nie jest tablicą, obiektem, liczbą, ciągiem lub atomem. Nie wiem, co to ma być, więc nie mogę ci powiedzieć, do czego to zmienić.

Jeśli jest to ciąg znaków, należy go umieścić w ".

Zobacz także: JSON Lint.

+0

bardzo przydatny jako json validtor. dziękuje – Max

Powiązane problemy