Testuję jakiś kod i stworzyłem plik JSON z danymi.

Problem polega na tym, że otrzymuję "[Obiekt obiektu], [Obiekt obiektu]" w alercie. Brak danych.

Co ja robię źle?

Oto kod:

<!DOCTYPE HTML>
<html>
<head>
<title></title>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js"></script>

<script>

    $(document).ready(function() {
        $.getJSON("appData.json",function(results){alert(results);});
    });

</script>

</head>
<body>

</body>
</html>

A oto treść appdata.json

[{"foo":"bar"},{"foo2":"blablabla"}]

Ponadto plik index.html i plik JSON są zarówno na moim pulpicie, jak i stamtąd go prowadzę.

2
Satch3000 12 sierpień 2012, 00:11

3 odpowiedzi

Cóż, dostajesz tablicę obiektów, a tablice i obiekty są danymi.

  //          v----first Object in the outer Array
alert(results[0].foo);
  //              ^----foo property of the first Object

To tylko że alert pokazuje wartości domyślne toString() obiektów.

Kiedy używasz $.getJSON, jQuery przeniknęło automatycznie tekstu JSON do obiektów JavaScript. Jeśli chcesz, aby surowy json, zrób $.get.


Jeśli chcesz iterować tablicę, użyj pętli for lub jednej z metod iteracji z jQuery lub natywnego interfejsu API.

1
user1106925 11 sierpień 2012, 20:16

Podczas powiadamiania obiektu powie tylko to, [Object], a jeśli korzystanie z Firefoksa zawsze możesz zrobić alert(results.toSource());, ale lepsza opcja byłaby rozpoczęcia korzystania z konsoli (F12) zamiast:

$(document).ready(function() {
    $.getJSON("appData.json",function(results){
       console.log(results);
    });
});

I widać cały obiekt i jego struktura.

1
adeneo 11 sierpień 2012, 20:17

Nie ma tam problemu. To pozwala wiedzieć, że w tablicy znajdują się dwa obiekty. Powodem, dla którego otrzymujesz, dlatego, że jest to najwyższy poziom, więc otrzymujesz typy. Dobrym sposobem dostępu do danych JSON jest rekurencja.

function ContainsKeyValue( obj, key, value ){
for( all in obj )
{
    if( obj[all] != null && obj[all][key] == value ){
        return true;
    }
    if( typeof obj[all] == "object" && obj[all]!= null ){
        var found = ContainsKeyValue( obj[all], key, value );
        if( found == true ) return true;
    }
}
return false;
}

Spowoduje to rozpoczęcie od danego obiektu wewnątrz wykresu i powtórzyć wszystkie znalezione obiekty. Używam tego tak:

var liveData = [];
for( var item in json.Items)
{
if( ContainsKeyValue( json.Items[item], "Key", "Value" ) === true )
{
    liveData.push( json.Items[item] );
}
}
1
Travis J 11 sierpień 2012, 20:25