Czy ktoś może mi powiedzieć, jaka jest główna różnica między obiektem JavaScript zdefiniowanym za pomocą Object Literal Notation a obiektem JSON ?
Według książki JavaScript mówi, że jest to obiekt zdefiniowany za pomocą Notacji obiektowej :
var anObject = {
property1 : true,
showMessage : function (msg) { alert(msg) }
};
Dlaczego w tym przypadku nie jest to obiekt JSON? Tylko dlatego, że nie jest zdefiniowany za pomocą cudzysłowów?
javascript
json
object-notation
ołówek Ciasto
źródło
źródło
Odpowiedzi:
Najpierw wyjaśnijmy, czym tak naprawdę jest JSON . JSON to tekstowy , niezależny od języka format wymiany danych, podobnie jak XML, CSV lub YAML.
Dane mogą być przechowywane na wiele sposobów, ale jeśli powinny być przechowywane w pliku tekstowym i czytelne dla komputera, muszą mieć pewną strukturę. JSON jest jednym z wielu formatów definiujących taką strukturę.
Takie formaty są zwykle niezależne od języka, co oznacza, że mogą być przetwarzane przez Java, Python, JavaScript, PHP, jak go nazwiesz.
Natomiast JavaScript jest językiem programowania. Oczywiście JavaScript zapewnia również sposób definiowania / opisywania danych, ale jego składnia jest bardzo specyficzna dla JavaScript.
Jako przeciwny przykład Python ma pojęcie krotek , a ich składnia to
(x, y)
. JavaScript nie ma czegoś takiego.Przyjrzyjmy się różnicom składniowym między literałami obiektów JSON i JavaScript.
JSON ma następujące ograniczenia składniowe:
"
).true
false
null
{"foo":"bar","foo":"baz"}
) dają niezdefiniowane, specyficzne dla implementacji wyniki; specyfikacja JSON wyraźnie nie definiuje ich semantykiW JavaScript, literały obiektów mogą mieć
undefined
.Wiedząc o tym, po prostu patrząc na składnię , twój przykład nie jest JSON z dwóch powodów:
Ale co najważniejsze, aby powtórzyć moje wyjaśnienie od początku: jesteś w kontekście JavaScript. Definiujesz obiekt JavaScript. Jeśli istnieje, „obiekt JSON” może być zawarty tylko w ciągu:
Oznacza to, że jeśli piszesz kod źródłowy JavaScript i nie masz do czynienia z łańcuchem , nie masz do czynienia z JSON. Być może otrzymałeś dane jako JSON (np. Poprzez ajax lub odczyt z pliku), ale kiedy ty lub biblioteka, której używasz, przeanalizowało je, nie jest już JSON.
Tylko dlatego, że literały obiektów i JSON wyglądają podobnie , nie oznacza to, że można je nazywać zamiennie. Zobacz także Nie ma czegoś takiego jak „Obiekt JSON” .
źródło
JSON ma znacznie bardziej ograniczoną składnię, w tym:
"
i nie'
źródło
Tak naprawdę nie ma czegoś takiego jak „Obiekt JSON”.
Specyfikacja JSON to składnia do kodowania danych jako ciąg. To, co ludzie nazywają „Obiektem JSON” (w javascript), jest tak naprawdę zwykłym obiektem javascript, który (prawdopodobnie) został zdezserializowany z prawidłowego ciągu JSON i może być łatwo ponownie serializowany jako prawidłowy ciąg JSON. Ogólnie oznacza to, że zawiera tylko dane (a nie funkcje). Oznacza to również, że nie ma żadnych dat, ponieważ JSON nie ma typu daty (prawdopodobnie najbardziej bolesna rzecz w JSON;)
Ponadto (side-rant ...), gdy ludzie mówią o „obiekcie JSON”, prawie zawsze mają na myśli dane, które mają „nawiasy klamrowe” na najwyższym poziomie. Odpowiada to ładnie obiektowi javascript. Jednak specyfikacja JSON nie wymaga, aby istniał pojedynczy obiekt „nawiasów klamrowych” na najwyższym poziomie ciągu JSON. JSON jest całkowicie poprawny, aby mieć listę na najwyższym poziomie, a nawet mieć tylko jedną wartość. Tak więc, podczas gdy każdy „obiekt JSON” odpowiada prawidłowemu JSON, nie wszystkie prawidłowe ciągi JSON odpowiadają temu, co nazwalibyśmy „obiektem JSON”! (ponieważ ciąg może reprezentować listę lub wartość atomową)
źródło
JSON-text = object / array
.Według JSON w JavaScript ,
Innymi słowy, poprawny JSON jest także poprawną notacją dosłowną obiektu JavaScript, ale niekoniecznie na odwrót.
Oprócz czytania dokumentacji , jak sugerował @Filix King, sugeruję również zabawę z internetowym walidatorem JSON JSONLint . W ten sposób dowiedziałem się, że klucze obiektów JSON muszą być łańcuchami.
źródło
🔫 JSON : Beztłuszczowa alternatywa dla XML
JSON został powszechnie przyjęty przez ludzi, którzy stwierdzili, że znacznie ułatwia tworzenie rozproszonych aplikacji i usług. Oficjalny typ mediów internetowych dla JSON to
application/json
RFC 4627
. Nazwy plików JSON używają rozszerzenia.json
.► JavaScript Object Notation (
JSON
) to lekki, tekstowy, niezależny od języka format wymiany danych. JSON został wykorzystany do wymiany danych między aplikacjami napisanymi w dowolnym języku programowania.JSON jest podzbiorem JavaScript. Javascript został wyprowadzony ze standardu ECMAScript Programming Language Standard.
► ECMAScript
ECMAScript stał się jednym z najczęściej używanych na świecie języków programowania ogólnego przeznaczenia. Jest najlepiej znany jako język osadzony w przeglądarkach internetowych, ale jest również szeroko stosowany w aplikacjach serwerowych i osadzonych. ECMAScript jest oparta na kilku technologii, pochodzących z najbardziej znaną istotą
JavaScript
(Netscape Communications)) iJScript
(Microsoft Corporation).) . Chociaż przed 1994 r. ECMA była znana jako „Europejskie Stowarzyszenie Producentów Komputerów”, po 1994 r., Kiedy organizacja stała się globalna, „znak towarowy” „Ecma” został zachowany ze względów historycznych.ECMAScript jest językiem, podczas gdy JavaScript, JScript, a nawet ActionScript są nazywane
"Dialects"
.Informacje o przeglądarce i komputerze użytkowników.
ECMAScript to język skryptowy, który stanowi podstawę JavaScript. .
JavaScript
language resources
ECMA-262
Links
Initial Edition, June 1997
PDF.
2nd Edition, August 1998
PDF.
3rd Edition, December 1999
PDF.
5th Edition, December 2009
PDF.
5.1 Edition, June 2011
HTML.
6th Edition, June 2015
HTML.
7ᵗʰ Edition, June 2016
HTML.
8th edition, June 2017
HTML.
9th Edition, 2018
HTML.
UWAGA « Czwarte wydanie ECMAScript nie zostało opublikowane, ponieważ praca była niekompletna .
► Wartości klucza muszą być cytowane, tylko klucze są dozwolone dla kluczy. Jeśli użyjesz innego niż String, zostanie przekonwertowany na String. Ale nie zaleca się używania kluczy innych niż String. Sprawdź przykład taki jak ten -
{ 'key':'val' }
ponadRFC 4627 - jsonformatter
► Ciągi JSON muszą być cytowane za pomocą „a nie”. Ciąg jest bardzo podobny do ciągu C lub Java. Ciągi powinny być zawinięte w podwójne cudzysłowy.
Accessory właściwości obiektu zapewniają dostęp do właściwości obiektu za pomocą notacji kropkowej lub notacji nawiasowej.
► Masz bardziej ograniczony zakres wartości (np. Niedozwolone funkcje). Wartością może być ciąg znaków w podwójnych cudzysłowach, liczba, wartość logiczna, null, obiekt lub tablica. Struktury te można zagnieżdżać.
►
JavaScript
jest najpopularniejszą implementacją standardu ECMAScript. Podstawowe funkcje Javascript są oparte na standardzie ECMAScript, ale Javascript ma również inne dodatkowe funkcje, których nie ma w specyfikacji / standardzie ECMA. Każda przeglądarka ma interpreter JavaScript.JavaScript jest językiem pisanym dynamicznie. Oznacza to, że nie musisz określać typu danych zmiennej podczas jej deklarowania, a typy danych są konwertowane automatycznie w razie potrzeby podczas wykonywania skryptu.
Literals
:Object literals
RFC 7159
Struktura obiektu jest reprezentowana jako para nawiasów klamrowych otaczających zero lub więcej par nazwa / wartość (lub członków). Nazwa to ciąg znaków. Po każdej nazwie występuje pojedynczy dwukropek, oddzielający nazwę od wartości. Pojedynczy przecinek oddziela wartość od następującej nazwy. Nazwy w obiekcie POWINNY być unikalne.
ECMAScript obsługuje dziedziczenie oparte na prototypach. Każdy konstruktor ma powiązany prototyp, a każdy obiekt utworzony przez ten konstruktor ma niejawne odniesienie do prototypu (zwanego prototypem obiektu) powiązanego z jego konstruktorem. Ponadto prototyp może zawierać niejawne odniesienie do swojego prototypu i tak dalej; nazywa się to łańcuchem prototypowym.
W zorientowanym obiektowo języku zorientowanym na ogół stan jest przenoszony przez instancje, metody są przenoszone przez klasy, a dziedziczenie ma jedynie strukturę i zachowanie. W ECMAScript stan i metody są przenoszone przez obiekty, a struktura, zachowanie i stan są dziedziczone.
Prototyp to obiekt służący do implementacji dziedziczenia struktury, stanu i zachowania w ECMAScript. Kiedy konstruktor tworzy obiekt, obiekt ten domyślnie odwołuje się do powiązanego z nim prototypu konstruktora w celu rozstrzygania odwołań do właściwości. Powiązany prototyp konstruktora może być przywoływany przez wyrażenie programu konstruktor. Prototyp, a właściwości dodane do prototypu obiektu są współdzielone, poprzez dziedziczenie, przez wszystkie obiekty współużytkujące prototyp.
źródło
Dla tych, którzy nadal uważają, że RFC są ważniejsze niż blogi i nieporozumienia oparte na opiniach, spróbujmy odpowiedzieć na wyjaśnienia niektórych kwestii. Nie zamierzam powtarzać wszystkich poprawnych różnic wspomnianych już w poprzednich odpowiedziach, tutaj próbuję tylko dodać wartość podsumowującą jakąś kluczową część rfc7159
Wyciągi z https://tools.ietf.org/html/rfc7159
Przykłady (od strony 12 RFC)
To jest obiekt JSON:
Jego element członkowski Image jest obiektem, którego element Miniatura jest obiektem, a element ID jest tablicą liczb.
Naprawdę?
źródło
Object
, to jestString
. DziękiO ile rozumiem, główną różnicą jest elastyczność .
JSON jest rodzajem opakowania „JavaScript Object Notation”, który zmusza użytkowników do przestrzegania bardziej surowych zasad definiowania obiektów. Robi to poprzez ograniczenie możliwych sposobów deklaracji obiektów udostępnianych przez funkcję JavaScript Object Notation.
W rezultacie mamy prostsze i bardziej znormalizowane obiekty, które lepiej pasują do wymiany danych między platformami.
Zasadniczo newObject w powyższym przykładzie jest obiektem zdefiniowanym za pomocą JavaScript Objeect Notation; ale nie jest to „prawidłowy” obiekt JSON, ponieważ nie przestrzega zasad wymaganych przez standardy JSON.
Ten link jest również bardzo pomocny: http://msdn.microsoft.com/en-us/library/bb299886.aspx
źródło
Najpierw powinieneś wiedzieć, co to jest JSON:
Jest to niezależny od języka format wymiany danych. Składnia JSON została zainspirowana notacją dosłowną Object JavaScript, ale istnieją między nimi różnice.
Na przykład w JSON wszystkie klucze muszą być cytowane, podczas gdy w literałach obiektowych nie jest to konieczne:
// JSON: {„foo”: „bar”}
// Literał obiektu: var o = {foo: "bar"}; Cytaty są obowiązkowe w JSON, ponieważ w JavaScript (a dokładniej w ECMAScript 3. wydanie) użycie słów zastrzeżonych jako nazw właściwości jest niedozwolone, na przykład:
var o = {if: "foo"}; // SyntaxError w ES3 Podczas gdy użycie literału ciągu jako nazwy właściwości (cytowanie nazwy właściwości) nie stwarza problemów:
var o = {"if": "foo"}; Tak więc dla „kompatybilności” (i łatwej oceny?) Cytaty są obowiązkowe.
Typy danych w JSON są również ograniczone do następujących wartości:
liczba ciągów tablica obiektów Literał jako: prawda fałsz null Zmienia się gramatyka ciągów. Muszą być one rozdzielone podwójnymi cudzysłowami, podczas gdy w JavaScript można używać zamiennie pojedynczych lub podwójnych cudzysłowów.
// Niepoprawny JSON: {"foo": 'bar'} Zmienia się również zaakceptowana gramatyka liczb JSON, w JavaScript możesz używać literałów szesnastkowych, na przykład 0xFF, lub (niesławnych) literałów ósemkowych, np. 010. W JSON możesz używać tylko dziesiętne literały.
// Niepoprawny JSON: {"foo": 0xFF}
źródło
JavaScript Object Literal vs JSON:
JSON
Język, który oznacza „JavaScript Object Notation”, ma swoją składnię pochodzącą ze składnią dosłownym obiekt JavaScript. Jest używany jako niezależny od języka programowania format przesyłania danych tekstowych.Przykład:
Notacja obiektowa JS, używana w JS do wygodnego tworzenia obiektów w kodzie:
Przykład JSON:
Główne różnice:
Wszystkie klucze obiektów w JSON muszą być ciągami. W JavaScript obiektowymi kluczami mogą być ciągi lub liczby
Wszystkie ciągi w JSON muszą być cytowane w „cudzysłowach”. Natomiast w Javascript dozwolone są zarówno pojedyncze, jak i podwójne cudzysłowy. Nawet bez cudzysłowów w notacji obiektu JavaScript klucze obiektów są domyślnie rzutowane na łańcuchy.
W JSON funkcji nie można zdefiniować jako wartości obiektu (ponieważ jest to specyficzne dla Javascript). W Javascript jest to całkowicie legalne.
JavaScript wbudowany w
JSON
obiekt:JSON
obiekty można łatwo przekonwertować na Javascript i odwrotnie za pomocą wbudowanegoJSON
obiektu, który JavaScript oferuje w swoim środowisku wykonawczym. Na przykład:źródło
Oto jedna zaskakująca różnica: nie można używać
undefined
w Jsonie, a wszystkie pola obiektów o nieokreślonych wartościach znikną późniejJSON.stringify
🙈🙉🙊
źródło