javascript - Hva er forskjellen mellom JSON og objektlitteraturnotasjon?
Kan noen fortelle meg hva som er hovedforskjellen mellom et JavaScript-objekt definert ved bruk av Object Literal Notation og et JSON-objekt?
Ifølge en JavaScript-bok står det at dette er et objekt definert ved å bruke Objektnotasjon:
var anObject = {
property1 : true,
showMessage : function (msg) { alert(msg) }
};
Hvorfor er det ikke et JSON-objekt i dette tilfellet? Bare fordi det ikke er definert ved å bruke anførselstegn?
Svar #1
La oss først klargjøre hva JSON faktisk er. JSON er et tekstuelt, språkuavhengig datautvekslingsformat, mye som XML, CSV eller YAML.
Data kan lagres på mange måter, men hvis det skal lagres i en tekstfil og være lesbart av en datamaskin, må det følge en viss struktur. JSON er en av de mange formatene som definerer en slik struktur.
Slike formater er typisk språk-uavhengige, noe som betyr at de kan behandles av Java, Python, JavaScript, PHP, du nevner det.
Derimot er JavaScript et programmeringsspråk. Selvfølgelig gir JavaScript også en måte å definere/beskrive data på, men syntaksen er veldig spesifikk for JavaScript.
Som et moteksempel har Python konseptet tupler, deres syntaks er (x, y). JavaScript har ikke noe lignende.
La oss se på de syntaktiske forskjellene mellom JSON og JavaScript-objektlitteraler.
JSON har følgende syntaktiske begrensninger:
- Objekt nøkler må være strenger (dvs. en tegnsekvens omsluttet av doble anførselstegn
"). Verdiene kan være enten:
- en streng
- et tall
- et (JSON) objekt
- et array
truefalsenull
{"foo":"bar","foo":"baz"}) gir udefinerte, implementeringsspesifikke resultater; JSON-spesifikasjonen definerer spesifikt ikke deres semantikkI JavaScript kan objektsliteraler ha
- Strenglitteraler, talllitteraler eller identifikatornavn som nøkler (siden ES6 kan nøkler nå også være beregnede, noe som introduserer en ny syntaks).
- Verdiene kan være hvilken som helst gyldig JavaScript-uttrykk, inkludert funksjonsdefinisjoner og
undefined. - Dupliserte nøkler gir definerte, spesifiserte resultater (i løs modus erstatter den sistnevnte definisjonen den første; i streng modus er det en feil).
Å vite det, bare ved å se på syntaksen, er eksemplet ditt ikke JSON av to grunner:
- Dine nøkler er ikke strenger (literaler). De er identifikatornavn.
- Du kan ikke tilordne en funksjon som en verdi til et "JSON-objekt" (fordi JSON ikke definerer noen syntaks for funksjoner).
Men viktigst av alt, for å gjenta forklaringen min fra begynnelsen: Du er i en JavaScript-kontekst. Du definerer et JavaScript-objekt. Hvis overhodet, kan et «JSON-objekt» bare være inneholdt i en streng:
var obj = {foo: 42}; // creates a JavaScript object (this is *not* JSON)
var json = '{"foo": 452}'; // creates a string containing JSON
Det vil si, hvis du skriver JavaScript-kildekode, og ikke håndterer en streng, håndterer du ikke JSON. Kanskje du mottok dataene som JSON (f.eks. via Ajax eller ved å lese fra en fil), men når du eller et bibliotek du bruker har analysert dem, er det ikke JSON lenger.
Bare fordi objekt-litteraler og JSON ser like ut, betyr det ikke at du kan kalle dem om hverandre. Se også Det finnes ikke noe som heter et "JSON-objekt".
Svar #2
JSON har en mye mer begrenset syntaks som inkluderer:
- Nøkkelverdier må være i anførselstegn
- Strenger må være omgitt av
"og ikke' - Du har et mer begrenset spekter av verdier (f.eks. ingen funksjoner tillatt)
- Ingen kommentarer (
/* */eller//er tillatt)
Svar #3
Det finnes egentlig ikke noe som heter en "JSON-objekt".
JSON-spesifikasjonen er en syntaks for å kode data som en streng. Det folk kaller et "JSON-objekt" (i JavaScript) er egentlig bare et ordinært JavaScript-objekt som (sannsynligvis) har blitt deserialisert fra en gyldig JSON-streng, og kan enkelt bli serialisert igjen som en gyldig JSON-streng. Dette betyr generelt at det kun inneholder data (og ikke funksjoner). Det betyr også at det ikke finnes datoer, fordi JSON ikke har en datotype (sannsynligvis det mest plagsomme med JSON ;)
Videre, (side-innlegg...) når folk snakker om et "JSON-objekt", mener de nesten alltid data som har "krøllparenteser" på toppnivå. Dette tilsvarer fint et JavaScript-objekt. Imidlertid krever ikke JSON-spesifikasjonen at det skal være et enkelt "krøllparentes"-objekt på toppnivå i en JSON-streng. Det er fullt gyldig JSON å ha en liste på toppnivå, eller til og med bare en enkelt verdi. Så, mens hvert "JSON-objekt" tilsvarer gyldig JSON, tilsvarer ikke alle gyldige JSON-strenger det vi ville kalt et "JSON-objekt"! (fordi strengen kan representere en liste eller en atomær verdi)
Svar #4
Ifølge JSON i JavaScript,
JSON er et delsett av objektbokstavnotsjonen i JavaScript.
Med andre ord, gyldig JSON er også gyldig JavaScript-objektnotasjon, men ikke nødvendigvis omvendt.
I tillegg til å lese dokumentasjonen, som @Filix King foreslo, foreslår jeg også å leke litt med den nettbaserte JSON-validatoren JSONLint. Det var slik jeg lærte at nøklene i JSON-objekter må være strenger.
