2014-05-08 11 views
6

Ho il seguente codice, purtroppo non ho alcun controllo su questa uscita.Come analizzare JSON con il numero come chiave

{ 
"questions": { 
    "9733": { 
     "text": "Star Trek or Star Wars?", 
     "answers": { 
      "41003": "Star Trek", 
      "41004": "Star Wars", 
      "41005": "Neither is superior in my opinion; both great in their own ways", 
      "41006": "Not a fan", 
      "41007": "I don't have an opinion on this" 
     } 
    }, 
    "25272": { 
     "text": "Which of these summer movies are you looking forward to the most?", 
     "answers": { 
      "99545": "World War Z", 
      "99546": "Monsters University ", 
      "99547": "White House Down", 
      "99548": "Man of Steel", 
      "99549": "Lone Ranger", 
      "99550": "The Wolverine" 
     } 
    }, 
    "27547": { 
     "text": "Should the U.S. attack Syria?", 
     "answers": { 
      "107453": "Yes", 
      "107454": "No" 
     } 
    } 
} 
} 

Sto usando json.parse per analizzare questo. Per ottenere il testo della prima domanda normalmente farei qualcosa di simile.

var jsonData = JSON.parse(data);//Where data = the json above 
console.log(jsonData.questions.9733.text);//Obviously this fails 

Tuttavia javascript non piace quel numero in là ovviamente. Come consiglieresti di accedere al testo della prima domanda? Preferirei che il json fosse configurato meglio con una serie di domande. Sfortunatamente non ho alcun controllo sull'output di questo JSON.

Inoltre, non mi accorgo di quali sono le chiavi mentre si imbattono, ma questo è un altro problema. Sono disposto ad intrattenere qualsiasi suggerimento su come analizzare questa cosa come non ho mai dovuto analizzare una tale uscita JSON così strana.

+0

Vorrei solo usare 'jsonData [ 'domande'] [ '9733'] [ 'testo']' ' – NullUserException

+0

jsonData.questions [9733] .text' dovrebbero funzionare. 'foo.bar' e' foo ['bar'] 'sono equivalenti in JS. – IMSoP

risposta

8

è necessario utilizzare bracket notation:

console.log(jsonData.questions["9733"].text); 

Ma perché il valore all'interno delle parentesi verrà convertito automaticamente una stringa, questo potrebbe anche funzionare:

console.log(jsonData.questions[9733].text); 

nota comunque che l'uso non le stringhe sono come nomi di proprietà generalmente di cattiva forma e potrebbero portare ad alcuni problemi sottili, ad es se il nome della proprietà era "001", quindi [001] sarebbe non lavoro.

+0

I nomi di proprietà vengono convertiti in stringhe, quindi il tuo ultimo esempio non funzionerà solo perché '001' viene convertito in' "1" 'piuttosto che' "001" ' – NullUserException

+0

@NullUserException No, in realtà non lo fa (almeno, non in Opera/Chrome). Ottengo "indefinito" quando si tenta l'ultimo esempio come numero, ma i dati effettivi quando lo converto in una stringa. – Cypher

+0

@Cypher Rileggi il mio commento. – NullUserException

1

Se si deve usare i numeri come chiavi ... si può accedervi in ​​questo modo:

var text = jsonData.questions["9733"].text; 

Edit: È anche possibile accedere con il numero 9733. Essa non deve essere una stringa . Deve solo essere una stringa se la chiave non è numerica.

2

io credo che si possa accedere ai dati tramite stessa sintassi di un array:

console.log(jsonData.questions[9733].text); 
+1

@NullUserException, ma funziona ancora – sabof

+1

@sabof Non ho detto che è un array, ma che la sintassi è la stessa. – Tohveli

+1

@NullUserException Certo, ci sono momenti in cui questo fallirà (vedi p.s.w.g's answer), ma in questo caso particolare funziona. Non vedo come ciò renda questa risposta "sbagliata". – Cypher

0

Prova utilizzando Ason, se si utilizza Java 8. Gradle dipendenza di compilazione 'org.arivu: ason: 1.0.3'.

codice Java come segue

Ason ason = new Ason(); 
Object json = ason.fromJson("<<JSON String!>>"); 
System.out.println(Ason.getJson(json, "questions.9733.text", null)): 
+0

Solo così sai che devi controllare i tag nella domanda per assicurarti di capire quale lingua viene utilizzata. In questo caso il tag è javascript e non java. – Caimen