2013-02-17 14 views
6

Come potrei ottenere un JSON serie di un file JSON con javascript e jqueryCome ottenere l'array JSON dal file con getJSON?

ero triyng con il codice successivo, con esso non lavorare:

var questions = []; 
function getArray(){ 
    $.getJSON('questions.json', function (json) { 
     for (var key in json) { 
      if (json.hasOwnProperty(key)) { 
       var item = json[key]; 
       questions.push({ 
        Category: item.Category 
       }); 
      } 
     } 
     return questions; 
    }) 
} 

questo è il file JSON chiamato: domande. jSON

{ 
"Biology":{ 
    "Category":{ 
     "cell":{ 
      "question1":{ 
       "que1":"What is the cell?" 
      }, 
      "option1":{ 
       "op1":"The cell is the basic structural and functional unit", 
       "op2":"is a fictional supervillain in Dragon Ball" 
      }, 
      "answer1":"opt1" 
     } 
    } 
}, 
"Astronomy":{ 
    "Category":{ 
     "Mars":{ 
      "question1":{ 
       "que1":"How many moons does Mars?" 
      }, 
      "option1":{ 
       "op1":"5", 
       "op2":"2" 
      }, 
      "answer1":"opt2" 
     } 
    } 
} 
} 

voglio ottenere un array con questo formato {Biologia: {Categoria: {cella: {question1 ....}}}} entro

risposta

9

$.getJSON è una funzione asincrona, in modo da restituire qualcosa dentro che la funzione non fa nulla, in quanto non è nella portata, o ancora ricevuto. Probabilmente si dovrebbe fare qualcosa di simile:

function getArray(){ 
    return $.getJSON('questions.json'); 
} 

getArray().done(function(json) { 
    // now you can use json 
    var questions = []; 
    $.each(json, function(key, val) { 
     questions[key] = { Category: val.Category }; 
    }); 
}); 
+0

Grazie. Funziona! –

+0

@chikatetsu - prego! – adeneo

+0

A proposito, come posso ottenere il valore per esempio di Astronomia ?? console.log (domande [1]. [Astronomia]), in questo modo è ok? –

3

tuo condizionale il ciclo for impedisce l'aggiunta di qualsiasi elemento all'array. Invece, controlla se il tuo oggetto JSON ha la proprietà, quindi ottieni il valore e aggiungilo al tuo array. In altre parole:

if (questions.hasOwnProperty(key)) dovrebbe essere if (json.hasOwnProperty(key))

Inoltre, non si può semplicemente return il risultato di una chiamata AJAX del genere, perché il metodo funziona in modo asincrono. Il numero return viene effettivamente applicato alla callback della funzione interna success, non getArray. È necessario utilizzare uno schema di callback per passare i dati solo una volta ricevuti e operare di conseguenza.

(Naturalmente dal momento che la matrice è definita nel perimetro esterno che non avrebbe dovuto restituirlo comunque, ma se si è tentato di usare prima il metodo di AJAX è conclusa sarebbe vuota.)

si Assumendo stanno per renderlo al DOM utilizzando un metodo chiamato renderJSON:

var questions = []; 
function getArray(){ 
    $.getJSON('questions.json', function (json) { 
     for (var key in json) { 
      if (json.hasOwnProperty(key)) { 
       var item = json[key]; 
       questions.push({ 
        Category: item.Category 
       }); 
      } 
     } 
     renderJSON(questions); 
    }); 
} 
+0

ho già cambiato, ma ancora non funziona –

+0

@chikatetsu funziona per me: http://jsfiddle.net/H2jQD/. Cosa intendi con "non funziona"? Cosa ti aspetti che faccia? – nbrooks

+1

P.S. @whoeverdownvoted È sempre bene spiegare perché ... OP ha cambiato codice dopo il mio post, quindi non è stato possibile vedere il vecchio problema. – nbrooks

Problemi correlati