2012-07-24 9 views
5

Se avessi un file il cui contenuto sembrava:Come leggere un file JSON contenente più elementi di root?

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

potrebbe semplicemente analizzare ogni riga separata come oggetto JSON separato (usando JsonCpp). Ma cosa succede se la struttura del file era meno conveniente in questo modo:

{ 
    "one":1 
} 

{ 
    "two":2 
} 
+0

Domanda correlata: [Come rilevare spazzatura finale utilizzando Jackson ObjectMapper] (http://stackoverflow.com/questions/26003171/how-to-detect-trailing-garbage-using-jackson-objectmapper) – sleske

risposta

5

Nessun esempio nella tua domanda è un oggetto JSON valido; un oggetto JSON può avere solo una radice. Devi dividere il file in due oggetti, quindi analizzarli.

È possibile utilizzare http://jsonlint.com per verificare se una determinata stringa è JSON valida o meno.

Quindi mi raccomando di cambiare ciò che mai sta scaricando più oggetti JSON in un singolo file per farlo in file separati, o di mettere ogni oggetto come valore in un oggetto radice JSON.

Se non si ha il controllo su ciò che sta creando, si è bloccato l'analisi del file per individuare i diversi oggetti radice.

Ecco un modo valido di codificare tali dati in un oggetto JSON:

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

o se il tuo davvero bisogno oggetti separati, come questo:

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

Il primo esempio non è anche un oggetto valido, questo è il punto della domanda. –

+1

Spiacente, avrei dovuto dire che dovremmo assumere che non ho il controllo del formato del file. – Tshepang

+2

Non sono a conoscenza di un parser JSON che si occuperà di più oggetti root (forse qualcuno può correggermi), quindi probabilmente non riuscirete a eseguire il parsing del conteggio {} per trovare dove sono gli oggetti root. – Almo

2

Rob Kennedy è giusto. Chiamarlo una seconda volta estrarrebbe il prossimo oggetto, e così via. La maggior parte della lib di json non può aiutarti a fare tutto in una singola radice. A meno che tu non stia utilizzando un framework di fascia alta in QT.

+0

quale framework QT è quello – Tshepang

+0

Sì, 'jsoncpp' funziona come descritto da R.Kennedy. – cdunn2001