2011-11-22 6 views
6

Tengo problemas para analizar un objeto json con perl y no sé si el problema proviene del json o de mi secuencia de comandos. Aquí está el JSON:cadena JSON malformada, ni matriz, objeto, número, cadena o átomo

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

aquí la secuencia de comandos:
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)}; 

Y, finalmente, el error que estoy consiguiendo:
error

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

Q: ¿Puede alguien decirme si el problema proviene de la JSON o mi guión y lo que debe cambiar en cualquier caso?

FYI el json is coming from Alfresco auditing api.

+3

yo sepa que no es válida JSON, comillas alrededor de los valores que faltan. – Mat

+0

Estaba lidiando exactamente con el mismo problema. Tengo una pregunta para el autor del hilo: ¿cómo accedes a las variables @json? Sigo averiguando que @json es un HASH en la memoria, pero no puedo acceder a las variables ni recorrerlo. –

Respuesta

2

Funciona si se citan los valores de auditoría ... y administración. La línea

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

tiene que ser sólo

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

de hecho, funciona cuando se citan los valores de 'application' y' user'. ¿Hay alguna manera de decirle a 'perl' que sea un poco más flexible en el análisis sintáctico de JSON y acepte cadenas sin comillas? (Eso me salvaría de tener que reescribir el json). – Max

+1

No estoy seguro, el autor del módulo JSON considera que la verificación estricta es una característica de seguridad. Puede tocar el código, JSON :: PP es una versión pura de Perl. –

+5

Le está pidiendo a un analizador JSON que analice correctamente los datos que no son JSON válidos. De esa manera yace la locura, seguramente :) –

10

Este:

"application":AuditExampleLogin1, 

... es JSON válido. AuditExampleLogin1 no es una matriz, objeto, número, cadena o átomo. No sé lo que se supone que es, así que no puedo decirte a qué cambiarlo.

Si se trata de una cadena, debe encerrarla en ".

Véase también: JSON Lint.

+0

muy útil que json validtor. gracias – Max

Cuestiones relacionadas