Jeśli przekonwertuję powyższy obiekt na JSON za pomocą var jSonString = JSON.stringify(testObject);
, jaka jest różnica między 2 (JS obj i JSON)?
JSON to format wymiany danych. Jest to standard opisujący, w jaki sposób uporządkowane listy i nieuporządkowane mapy, ciągi logiczne i liczby mogą być reprezentowane w ciągu. Podobnie jak XML i YAML to sposób przekazywania informacji strukturalnych między językami, JSON jest taki sam. Z drugiej strony obiekt JavaScript jest typem fizycznym. Podobnie jak tablica PHP, klasa / struktura C ++, obiekt JavaScript jest rodzajem wewnętrznym dla JavaScript.
Oto historia. Wyobraźmy sobie, że kupiłeś jakieś meble ze sklepu i chcesz je dostarczyć. W magazynie pozostaje jednak tylko model wyświetlacza, ale zgadzasz się na jego zakup.
W sklepie zakupiona komoda to żywy przedmiot:
var chestOfDrawers = {
color: "red",
numberOfDrawers: 4
}
Nie możesz jednak wysyłać komody z postem, więc ją demontujesz (czytaj, szykuj). Jest teraz bezużyteczny pod względem mebli. Teraz jest JSON. Jest w płaskiej formie.
{"color":"red","numberOfDrawers":4}
Kiedy je otrzymasz, odbudujesz komodę (przeczytaj, przeanalizuj). Teraz jest z powrotem w formie obiektu.
JSON / XML i YAML mają na celu umożliwienie przesyłania danych między językami programowania w formacie zrozumiałym dla obu języków uczestniczących; nie możesz podać PHP lub C ++ bezpośrednio swojego obiektu JavaScript; ponieważ każdy język reprezentuje obiekt inaczej pod maską. Ponieważ jednak podzieliliśmy obiekt na notację JSON; tzn. znormalizowany sposób reprezentacji danych, możemy przesłać reprezentację JSON obiektu do innego języka (C ++, PHP), mogą odtworzyć obiekt JavaScript, który mieliśmy w swoim własnym obiekcie, w oparciu o reprezentację JSON obiektu.
Należy zauważyć, że JSON nie może reprezentować funkcji ani dat. Jeśli spróbujesz skreślić obiekt za pomocą elementu funkcji, funkcja zostanie pominięta w reprezentacji JSON. Data zostanie przekonwertowana na ciąg;
JSON.stringify({
foo: new Date(),
blah: function () {
alert('hello');
}
}); // returns the string "{"foo":"2011-11-28T10:21:33.939Z"}"
P1: Podczas definiowania literałów obiektów w javascript klucze mogą zawierać cudzysłowy lub nie. Nie ma żadnej różnicy, z wyjątkiem tego, że cudzysłowy pozwalają określić pewne klucze, które spowodowałyby, że interpreter nie mógłby się sparować, gdybyś wypróbował je same. Na przykład, jeśli chcesz klucz, który był tylko wykrzyknikiem, potrzebujesz cudzysłowów:
Jednak w większości przypadków można pominąć cudzysłowy wokół klawiszy na literałach obiektów.
Q2: JSON jest dosłownie ciągiem znaków. To tylko struna. Rozważ to:
Ponieważ
testObject
jest to prawdziwy obiekt, możesz wywoływać na nim właściwości i robić wszystko, co możesz zrobić z obiektami:Z drugiej strony
jsonString
jest tylko ciągiem znaków:Zauważ jeszcze jedną różnicę: w JSON wszystkie klucze muszą być cytowane. Kontrastuje to z literałami przedmiotowymi, w których cytaty można zwykle pominąć zgodnie z moim wyjaśnieniem w Q1.
Pytanie 3 Możesz parsować ciąg JSON za pomocą
JSON.parse
, i jest to ogólnie najlepszy sposób, aby to zrobić (jeśli przeglądarka lub środowisko to zapewnia). Możesz także użyć,eval
ponieważ JSON jest poprawnym kodem javascript, ale poprzednia metoda jest zalecana z wielu powodów (eval ma z sobą wiele nieprzyjemnych problemów).źródło
Problemy rozwiązane przez JSON
Załóżmy, że chcesz wymieniać zwykłe obiekty JavaScript między dwoma komputerami i ustawisz dwie reguły:
Teraz tworzysz dwa obiekty na pierwszym hoście:
Jak przekonwertować te obiekty na ciągi w celu transmisji do drugiego hosta?
'{ one: 1,"two":2,"three":3 }'
, ale tak naprawdę nie możesz odczytać literału w części skryptu dokumentu (przynajmniej nie łatwo). Takobj1
iobj2
rzeczywiście muszą być przetwarzane w ten sam sposób.JSON został stworzony jako rozwiązanie właśnie omawianych potrzeb: jest to zestaw reguł do tworzenia ciągu równoważnego z obiektem poprzez wyświetlenie wszystkich atrybutów i wartości (metody są ignorowane).
JSON normalizuje użycie podwójnych cudzysłowów dla nazw i wartości atrybutów.
Pamiętaj, że JSON jest tylko zbiorem reguł (standard).
Ile obiektów JSON zostało utworzonych?
Tylko jeden jest automatycznie tworzony przez silnik JS.
Nowoczesne silniki JavaScript znalezione w przeglądarkach mają obiekt macierzysty, zwany także JSON. Ten obiekt JSON może:
Dekoduj ciąg zbudowany przy użyciu standardu JSON, używając JSON.parse (ciąg). Wynikiem jest zwykły obiekt JS z atrybutami i wartościami znalezionymi w ciągu JSON.
Zakoduj atrybuty / wartości zwykłego obiektu JS za pomocą JSON.stringify (). Wynikiem jest ciąg zgodny z zestawem reguł JSON.
(Pojedynczy) obiekt JSON jest podobny do kodeka, jego funkcją jest kodowanie i dekodowanie.
Uwaga:
JSON.parse () nie tworzy obiektu JSON, tworzy zwykły obiekt JS, nie ma różnicy między obiektem utworzonym za pomocą literału obiektu a obiektem utworzonym przez JSON.parse () z łańcucha zgodnego z JSON.
Jest tylko jeden obiekt JSON, który jest używany do wszystkich konwersji.
Wracając do pytań :
P1: W przypadku literałów obiektowych dozwolone jest stosowanie pojedynczego podwójnego cudzysłowu. Zauważ, że cudzysłowy są używane opcjonalnie dla nazw atrybutów i są obowiązkowe dla wartości ciągu. Sam dosłowny obiekt nie jest otoczony cudzysłowami.
Q2: Obiekty utworzone z literałów i przy użyciu JSON.parse () są dokładnie takie same. Te dwa obiekty są równoważne po utworzeniu:
var obj1 = { one: 1, "two": 2, "three": 3 };
var obj2 = JSON.parse('{ "one": "1", "two": "2", "three": "3" }');
P3: W nowoczesnych przeglądarkach
JSON.parse()
jest używany do tworzenia obiektu JS z ciągu zgodnego z JSON. (jQuery ma również równoważną metodę, której można używać we wszystkich przeglądarkach).źródło
Q1 - w JS musisz używać cudzysłowów tylko wtedy, gdy klucz jest słowem zastrzeżonym lub jeśli w przeciwnym razie byłby to nielegalny token. W JSON MUSISZ zawsze używać podwójnych cudzysłowów przy nazwach kluczy.
Q2 -
jsonString
to serializowana wersja obiektu wejściowego ...Q3 - który można przekształcić do postaci szeregowej za pomocą identycznie wyglądającego obiektu
JSON.parse()
źródło
Pytanie ma już dobre odpowiedzi, poniżej dodaję mały przykład, który ułatwi zrozumienie wyjaśnień podanych w poprzednich odpowiedziach. Skopiuj wklej poniżej fragmentu do IDE, aby lepiej zrozumieć i skomentuj wiersz zawierający
invalid_javascript_object_no_quotes
deklarację obiektu, aby uniknąć błędu czasu kompilacji.źródło