2015-12-26 16 views
5

Jak mogę uzyskać tylko nazwę z pliku JSON. Również kod działa idealnie, aby uzyskać dane z pliku "file.json", co nie jest problemem na pewno.Pobierz tylko jeden element z tablicy obiektów w JSON

JavaScript:

var data = []; 
 
function getName() { 
 
    //what should I write here to get only name from the first object i.e. John 
 
    //with this: data[0].name I am getting error! 
 
} 
 

 
var xhttp; 
 
if(window.XMLHttpRequest) 
 
    xhttp = new XMLHttpRequest(); 
 
else 
 
    xhttp = new ActiveXObject("Microsoft.XMLHTTP"); 
 
    
 
xhttp.onreadystatechange = function() { 
 
    if(xhttp.readyState == 4) { 
 
    data = JSON.parse(xhttp.responseText); 
 
    getName(); 
 
    } 
 
} 
 

 
xhttp.open("GET","file.json",true); 
 
xhttp.send();

"file.json" - JSON:

[ 
 
    { 
 
    "name":"John", 
 
    "city":"London" 
 
    }, 
 
    { 
 
    "name":"Maria", 
 
    "city":"Rome" 
 
    } 
 
]

+0

(Zamiast 'onreadystatechange' i' readyState', możesz po prostu użyć 'onload'.) – Rudie

+0

Działa dobrze dla mnie, jak w, bez błędu. Jaki jest twój błąd? https://jsfiddle.net/rudiedirkx/0xf62ny6/ loguje cały obiekt danych, a następnie 'dane [0] .name' – Rudie

+1

Jaki jest błąd? Dlaczego używasz zmiennej globalnej zamiast przekazywać wartość do funkcji? –

Odpowiedz

6

przekazać dane zmienne poprzez funkcję

var data = []; 
function getName(data) { 
    return data[0].name; 
} 

var xhttp; 
if(window.XMLHttpRequest) 
    xhttp = new XMLHttpRequest(); 
else 
    xhttp = new ActiveXObject("Microsoft.XMLHTTP"); 

xhttp.onreadystatechange = function() { 
    if(xhttp.readyState == 4) { 
    data = JSON.parse(xhttp.responseText); 
    getName(data); 
    } 
} 

xhttp.open("GET","file.json",true); 
xhttp.send(); 

Ponadto, jeśli chcesz pobrać wszystkie nazwy, można zrobić coś takiego:

function getName(data) { 
    var names = []; 
    for (var i = 0; i < data.length; i++) { 
     names.push(data[i].name); 
    } 
    return names; 
} 

(dane są dane array)

+0

to tylko imię indeksu –

+0

oczywiście, ale nie tego chciałeś? Lub chcesz zwrócić tablicę nazw? –

+0

Myślę, że autor tego pytania szuka, aby wszystkie nazwy w pliku json nie szukały tylko jednego imienia –

4

Zastosowanie Array.prototype.map() do transfrom elementy macierzy:

data.map(function(item) { 
    return item.name 
}); 
+0

Czy to jest funkcja jQuery? –

+0

nie, to czysty javascript – madox2

1

Twoja funkcja getName powinna wyglądać następująco:

function getName(){ 
    a.forEach(function(i,j){ 
    console.log(i.name); 
    }); 
} 
0

Warto wspomnieć, że typy danych JSON są bezpośrednio odwzorowywane na standardowe typy danych javascript. Oznacza to, że nie ma czegoś takiego jak tablica JSON, po otrzymaniu JSON.parse() ciągu znaków, otrzymasz proste prymitywy javascript: tablice, obiekty, łańcuchy, liczby itd.

Tak więc pobranie elementu z tablicy JSON jest po prostu uzyskiwanie dostępu do elementu standardowej tablicy javascript. Jest to zwykle osiągane przez operatora nawiasów kwadratowych var element = array[index].

Twój kod jest jednak podzielony na kilka części, które nie mają związku z dostępem do elementu tablicy.

Najpierw definiuje się zmienną data - po prostu nie jest ona potrzebna (przynajmniej według próbki).

Następnie należy go zainicjować pustą tablicą - nie mam pojęcia, dlaczego.

Twoje oddzwonienie jest bardzo proste, gdy wyrażone jest w słowach: dostajesz ciąg znaków, analizujesz go jako json, a następnie wywołujesz getName dostarczając wynik. Oznacza to, że Twój getName() powinien wymagać argumentu data, do którego następnie uzyskujesz dostęp w ramach funkcji.