2013-02-17 8 views
6

Jak mogę uzyskać json tablicy pliku json z JavaScript i jQueryJak uzyskać tablicę JSON z pliku z getJSON?

byłem triyng z następnego kodu, ze nie robi praca:

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; 
    }) 
} 

Jest to plik json nazywa: pytania. 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" 
     } 
    } 
} 
} 

Chcę uzyskać tablicę z tego formatu {Biologia: {Kategoria: {komórka: {question1 ....}}}} w

Odpowiedz

9

$.getJSON jest funkcja asynchroniczna, więc wracając coś wewnątrz tej funkcji nie robi nic, ponieważ nie jest w zakresie, albo jeszcze odebrany. powinieneś zrobić coś takiego:

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

Dzięki. To działa! –

+0

@ chikatetsu - nie ma za co! – adeneo

+0

Nawiasem mówiąc, jak mogę uzyskać wartość na przykład Astronomii? console.log (pytania [1]. [Astronomy]), w ten sposób jest ok? –

3

Twój warunkowy pętla for zapobiega dodawaniu czegokolwiek do macierzy. Zamiast tego sprawdź, czy twój obiekt Json ma właściwość, a następnie pobierz wartość i dodaj ją do swojej tablicy. Innymi słowy:

if (questions.hasOwnProperty(key)) powinny być if (json.hasOwnProperty(key))

Ponadto, nie można po prostu return wynikiem wywołania AJAX takiego, to dlatego, że metoda działa asynchronicznie. Ten return jest rzeczywiście stosowany do wewnętrznego wywołania funkcji, nie getArray. Musisz użyć wzorca oddzwaniania, aby przekazać dane tylko po ich otrzymaniu i działać zgodnie z nim.

(Oczywiście ponieważ tablica jest zdefiniowana w zakresie zewnętrznej nie będzie musiał go zwrócić w każdym razie, ale jeśli próbował użyć go przed metody AJAX zakończony byłoby puste.)

Zakładając cię zamierzamy uczynić go do DOM przy użyciu metody zwanej 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

już zmieniło, ale nadal nie działa –

+0

@chikatetsu działa na mnie: http://jsfiddle.net/H2jQD/. Co masz na myśli mówiąc "nie działa"? Czego oczekujesz od tego? – nbrooks

+1

P.S. @ WHoeverdownvoted Zawsze dobrze jest wyjaśnić, dlaczego ... OP zmienił kod po moim wpisie, a więc nie był w stanie zobaczyć stary problem. – nbrooks