2017-03-16 35 views
6
$.ajax({ 
    url: "get_cards.php", 
    type: "GET", 
    data: {selection:JSON.stringify(selection)}, 
    success: function(data) { 
     var json = JSON.parse(data); 
     sessionStorage.setItem("json", JSON.stringify(json)); 
    } 
}); 

Następnie w innym pliku jestem pobierania JSON z sessionStorage:Javascript: próbuje uzyskać dostęp do elementów tablicy JSON daje mi poszczególne znaki

var json = JSON.parse(JSON.stringify(sessionStorage.getItem("json"))); 
if(json) { 
    sessionStorage.removeItem("json"); 
} 

To daje mi tablicę obiektów JSON, przykład : [{'name':'Bob',...}]. Jednak, gdy próbuję uzyskać dostęp do pierwszego elementu tablicy: json[0], otrzymuję '[' i kiedy próbuję json[0].name otrzymam undefined. Długość json jest zgłaszana jako 159, więc zlicza każdy indywidualny znak jako element.

EDIT: Po aktualizacji do:

var json = JSON.parse(sessionStorage.getItem("json")); 
if(json) { 
    sessionStorage.removeItem("json"); 
} 

dostaję długości 1 (która jest poprawna), ale błąd przy dostępie json[0].name:

Uncaught TypeError: Cannot read property '0' of null 
at HTMLDocument.<anonymous> (studying.js:10) 
at j (jquery.min.js:2) 
at k (jquery.min.js:2) 
+0

masz łańcuch. Użyj 'JSON.parse() 'poprawnie – Weedoze

+0

dlaczego jesteś stringifying to tylko do parsowania go ponownie? – Cruiser

+0

Już zapisujesz ciąg json w pamięci lokalnej, dlaczego wywołujesz stringify dwa razy? – abhishekkannojia

Odpowiedz

8

Jesteś stringifying już stringified json:

var json = JSON.parse(JSON.stringify(sessionStorage.getItem("json"))); // wrong ! 

powinno to być:

var json = JSON.parse(sessionStorage.getItem("json")); 

Jeśli masz JSON.stringify("foo"), to masz cytowany ciąg: "\"foo\"".

JSON.stringify() konwertuje wartość notacji JSON reprezentującego go:

  • właściwości przedmiotów niż tablica nie jest zagwarantowane stringified w określonej kolejności. Nie należy polegać na zamawianiu właściwości w obrębie tego samego obiektu w ramach wiązania.
  • Boolean, Number i String obiekty są konwertowane do odpowiadających wartości pierwotnych stringification czasie, w zgodzie z tradycyjnymi konwersji semantyki.
  • Jeśli jest niezdefiniowana, podczas konwertowania napotkano funkcję lub symbol, który został pominięty (gdy zostanie znaleziony w obiekcie) lub poddany cenzurze wartości zerowej (gdy zostanie znaleziony w tablicy). JSON.stringify może również po prostu zwrócić undefined podczas przekazywania w "czystych" wartościach takich jak JSON.stringify (function() {}) lub JSON.stringify (undefined).
  • Wszystkie właściwości oznaczone kluczem symbolicznym zostaną całkowicie zignorowane, nawet jeśli użyje się funkcji zamiennej przy użyciu funkcji .
  • właściwości dla przeliczalne będą ignorowane

przykłady:

JSON.stringify({});     // '{}' 
JSON.stringify(true);    // 'true' 
JSON.stringify('foo');    // '"foo"' 
JSON.stringify([1, 'false', false]); // '[1,"false",false]' 
JSON.stringify({ x: 5 });   // '{"x":5}' 

Source: MDN

+1

choć jest to po prostu kod nadmiarowy, taki jak 'JSON.parse (JSON.stringify (sessionStorage.getItem (" json ")));' ale stringify string a potem parsowanie go do jsona powoduje, że jest to ciąg wartości? dlaczego? –

+4

@AnikIslamAbhi: Zawsze otrzymujesz oryginalną wartość. Oryginalna wartość ('sessionStorage.getItem (" json ")') jest łańcuchem znaków. 'JSON.parse (JSON.stringify (" foo ")) ===" foo "'. * "parsowanie go do json" * Nic nie jest przetwarzane * na * JSON. 'JSON.stringify' * tworzy JSON *. 'JSON.parse' tworzy natywną wartość JavaScript z JSON. Jeśli wartość ciągu została zakodowana jako JSON, otrzymasz wartość ciągu. Jeśli wartość liczbowa została zakodowana jako JSON, otrzymasz wartość liczbową. Jeśli tablica została zakodowana jako JSON, otrzymasz tablicę itp. –

+0

@FelixKlikanie jesteś niesamowity –