2012-07-24 5 views
5

Si tuviera un archivo cuyo contenido parecía:¿Cómo se lee un archivo JSON que contiene múltiples elementos raíz?

{"one": 1} 
{"two": 2} 

yo podría simplemente analizar cada línea por separado como un objeto JSON separada (usando JsonCpp). Pero ¿y si la estructura del archivo fuera menos conveniente así:

{ 
    "one":1 
} 

{ 
    "two":2 
} 
+0

Pregunta relacionada: [Cómo detectar la basura que se arrastra usando Jackson ObjectMapper] (http://stackoverflow.com/questions/26003171/how-to-detect-trailing-garbage-using-jackson-objectmapper) – sleske

Respuesta

5

Ninguno de los dos ejemplos en su pregunta es un objeto JSON válido; un objeto JSON solo puede tener una raíz. Tienes que dividir el archivo en dos objetos, luego analizarlos.

Puede usar http://jsonlint.com para ver si una cadena determinada es JSON válida o no.

Así que recomiendo cambiar lo que alguna vez está volcando múltiples objetos JSON en un solo archivo para hacerlo en archivos separados, o poner cada objeto como un valor en un objeto raíz JSON.

Si no tiene control sobre lo que está creando esto, entonces está bloqueado analizando el archivo usted mismo para seleccionar los diferentes objetos raíz.

Aquí está una manera válida de codificar los datos en un objeto JSON:

{ 
    "one": 1, 
    "two": 2 
} 

o si su realmente necesita objetos separados, así:

{ 
    "one": 
    { 
     "number": 1 
    }, 
    "two": 
    { 
     "number": 2 
    } 
} 
+1

El primer ejemplo es Tampoco es un objeto válido, ese es el punto de la pregunta. –

+1

Lo siento, debería haber mencionado que deberíamos asumir que no tengo control del formato del archivo. – Tshepang

+2

No conozco un analizador JSON que trate varios objetos raíz (quizás alguien me puede corregir), por lo que es probable que esté atascado en analizar para contar dónde coinciden {} para encontrar dónde están los objetos raíz. – Almo

2

Rob Kennedy es correcto. Llamarlo por segunda vez extraería el siguiente objeto, y así sucesivamente. La mayor parte de json lib no puede ayudarle a hacer todo en una sola raíz. A menos que esté utilizando un marco de gama alta en QT.

+0

cuyo marco de QT es – Tshepang

+0

Sí, 'jsoncpp' funciona como lo describe R.Kennedy. – cdunn2001

Cuestiones relacionadas