2011-11-22 4 views
6

У меня проблема с анализом json-объекта с perl, и я не знаю, исходит ли проблема из json или моего скрипта. Вот JSON:неправильная строка JSON, ни массив, ни объект, ни число, ни строка, ни атом

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

Вот сценарий:
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)}; 

И, наконец, ошибка я получаю:
ошибка

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

Вопрос: Может ли кто-нибудь сказать мне, возникает ли проблема из json или моего сценария и что менять в любом случае?

FYI json is coming from Alfresco auditing api.

+3

AFAIK это не действительный JSON, отсутствующим в кавычках значений. – Mat

+0

Я имел дело с точно такой же проблемой. У меня вопрос к автору темы: как вы получаете доступ к переменным @json? Я продолжаю понимать, что @json - это HASH в памяти, но я не могу получить доступ к переменным или петлю через него. –

ответ

2

Он работает, если указаны значения Audit ... и admin. Линия

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

должна быть только

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

действительно работает, когда цитируются значения 'application' и' user'. Есть ли способ сказать 'perl' быть немного более свободным при разборе JSON и принимать неучтенные строки? (это спасло бы меня от необходимости переписывать json). – Max

+1

Не уверен, автор модуля JSON считает, что проверка является функцией безопасности. Вы можете совать код, JSON :: PP - это чистая версия perl. –

+5

Вы просите парсер JSON успешно проанализировать данные, которые недействительны JSON. То есть безумие, конечно :) –

10

Это:

"application":AuditExampleLogin1, 

... недействительна JSON. AuditExampleLogin1 не является массивом, объектом, числом, строкой или атомом. Я не знаю, как это должно быть, поэтому я не могу сказать вам, что изменить.

Если это строка, вам необходимо приложить ее в ".

См. Также: JSON Lint.

+0

очень удобный это json validtor. спасибо – Max

Смежные вопросы