JSON (JavaScript Object Notation objektni zapis JavaScript) [jsón] je datotečni format in format za izmenjavo podatkov odprtega standarda, ki uporablja človeku berljivo besedilo za shranjevanje in prenašanje podatkovnih objektov, sestavljenih iz parov ime-vrednost in polj (ali drugih serializiranih vrednosti). Je pogosto uporabljen podatkovni format z različnimi uporabami v elektronski izmenjavi podatkov, vključujoč spletne aplikacije in strežnike.

JSON je od programskega jezika neodvisni podatkovni format. Izpeljan je bil iz JavaScripta, vendar mnogi moderni programski jeziki vključujejo kodo za ustvarjanje in razčlenjevanje podatkov v formatu JSON. Imena datotek JSON uporabljajo pripono .json.

Douglas Crockford je izvirno določil format JSON v začetku 2000-ih. Oni in Chip Morningstar so prvo sporočilo JSON poslali aprila 2001.

Poimenovanje in izgovorjava

Mednarodni standard iz leta 2017 (ECMA-404 in ISO/IEC 21778:2017) določa, da se »JSON« »izgovarja , kot v 'Jazon (Jason) in argonavti'«. Prva izdaja (2013) standarda ECMA-404 ni obravnavala izgovorjave. Crockford je leta 2011 dejal: »Veliko je razprav o tem, kako to izgovorite, ampak me to absolutno ne zanima.« je še ena pogosta izgovorjava.

Standardi

Potem ko je bil na voljo kot njegova »informativna« specifikacija od leta 2006, je bil JSON prvič standardiziran leta 2013 kot ECMA-404. , objavljen leta 2017, je trenutna različica internetnega standarda STD 90 in ostaja skladen z ECMA-404. Istega leta je bil JSON standardiziran tudi kot ISO/IEC 21778:2017. Standarda ECMA in ISO/IEC opisujeta le dovoljeno skladnjo, medtem ko RFC zajema nekatere varnostne in interoperabilnostne vidike.

Zgodovina

thumb|right|220px|Douglas Crockford na Yahoo Building leta 2007

JSON je nastal iz potrebe po komunikacijskem protokolumed strežnikom in brskalnikom v realnem času brez uporabe vtičnikov brskalnika, kot sta Flash ali java apleti, prevladujočih metod, ki so se uporabljale v zgodnjih 2000-ih.

Crockford je prvi določil in populariziral format JSON. Akronim je nastal v podjetju State Software, ki so ga soustanovili Crockford in drugi, marca 2001. Soustanovitelji so se dogovorili, da bodo zgradili sistem, ki bo uporabljal standardne zmogljivosti brskalnika in zagotavljal abstrakcijsko plast za spletne razvijalce za ustvarjanje spletnih aplikacij z ohranjanjem stanja, ki bodo imele trajno dupleksno povezavo s spletnim strežnikom, tako da bosta odprti dve povezavi HTTP in bodo reciklirane pred standardnimi časovnimi omejitvami brskalnika, če ne bodo izmenjani nadaljnji podatki. Soustanovitelji so imeli okroglo mizo in glasovali o tem, ali naj se podatkovni format imenuje JSML () ali JSON (), pa tudi pod kakšno vrsto licence naj bo na voljo. Spletna stran JSON.org je začela delovati leta 2001. Decembra 2005 je Yahoo! je začel ponujati nekatere svoje spletne storitve v JSON.

Predhodnik knjižnic JSON je bil uporabljen v projektu otroške igre za trgovanje z digitalnimi sredstvi z imenom Cartoon Orbit na Communities.com, ki je uporabljal stranski vtičnik brskalnika z lastniškim formatom sporočil za manipulacijo elementov DHTML. Po odkritju zgodnjih zmogljivosti Ajaxa so digiGroups, Noosh in drugi uporabili okvirje za posredovanje informacij v vidno polje uporabnikovega brskalnika brez osveževanja vizualnega konteksta spletne aplikacije, s čimer so ustvarili bogate spletne aplikacije v realnem času z uporabo le standardnih zmogljivosti HTTP, HTML in JavaScript iz brskalnikov Netscape 4.0.5+ in Internet Explorer 5+. Crockford je nato ugotovil, da bi se JavaScript lahko uporabljal kot objektno usmerjena oblika sporočil za tak sistem. Sistem je bil prodan podjetjem Sun Microsystems, Amazon.com in EDS.

JSON je temeljil na podmnožici skriptnega jezika JavaScript (natančneje na standardu ECMA-262, 3. izdaja – december 1999) in se pogosto uporablja z JavaScriptom, vendar je od jezika neodvisni podatkovni format. Koda za razčlenjevanje in ustvarjanje podatkov JSON je na voljo v mnogih programskih jezikih. Spletna stran JSON navaja knjižnice JSON po jezikih.

Oktobra 2013 je Ecma International objavila prvo izdajo svojega standarda JSON ECMA-404. Istega leta je uporabil ECMA-404 kot referenco. Leta 2014 je postal glavna referenca za internetno uporabo JSON-a in nadomestil in (vendar je ECMA-262 in ECMA-404 ohranil kot glavni referenci). Novembra 2017 je ISO/IEC JTC 1/SC 22 objavil ISO/IEC 21778:2017 kot mednarodni standard. 13. decembra 2017 je Projektna skupina za internetno inženirstvo (Internet Engineering Task Force, IETF) z objavo , ki je trenutna različica Internetnega standarda STD 90, razveljavila .

Crockford je licenci JSON dodal klavzulo, v kateri je zapisano: »Programska oprema se uporablja za dobro, ne za zlo«, da bi knjižnice JSON odkril kot odprtokodne, hkrati pa se je posmehoval korporativnim odvetnikom in tistim, ki so pretirano pedantni. Po drugi strani pa je ta klavzula povzročila težave z licenčno združljivostjo JSON z drugimi odprtokodnimi licencami, saj odprtokodna in prosta programska oprema običajno ne pomenita nobenih omejitev glede namena uporabe.

Skladnja

Naslednji primer prikazuje možno predstavitev JSON, ki opisuje osebo.

{ "first_name": "John", "last_name": "Smith", "is_alive": true, "age": 27, "address": { "street_address": "21 2nd Street", "city": "New York", "state": "NY", "postal_code": "10021-3100" }, "phone_numbers": [

"type": "home", "number": "212 555-1234" },

"type": "office", "number": "646 555-4567"

], "children": [ "Catherine", "Thomas", "Trevor" ], "spouse": null }

Kodiranje znakov

Čeprav je Crockford prvotno trdil, da je JSON stroga podmnožica JavaScripta in ECMAScripta, njuna specifikacija dejansko dovoljuje veljavne dokumente JSON, ki niso veljaven JavaScript JSON dovoljuje, da se znaka za zaključek vrstice in v narekovajih pojavita brez ubežnih znakov, medtem ko ECMAScript 2018 in starejši ne. To je posledica dejstva, da JSON ne dovoljuje samo »nadzornih znakov«. Za največjo prenosljivost so ti znaki ubežni s povratno (levo) poševnico.

Izmenjava JSON v odprtem ekosistemu mora biti kodirana v UTF-8. Kodiranje podpira celoten nabor znakov Unicode, vključno z znaki zunaj osnovne večjezične ravnine (U+0000 do U+FFFF). Če pa so ti znaki ubežni, morajo biti zapisani z nadomestnimi pari UTF-16. Na primer, če se želi v JSON vključiti znak emodži :

{ "face": "😐" }

Ali: { "face": "\uD83D\uDE10" }

JSON je postal stroga podmnožica jezika ECMAScript od revizije jezika leta 2019.

Podatkovni tipi

Osnovni podatkovni tipi JSON so:

število: predznačeno desetiško število, ki lahko vsebuje ulomek in uporablja eksponentni zapis E, vendar ne more vključevati neštevilskih vrednosti, kot je NaN. Format ne razlikuje med celim številom in številom s plavajočo vejico. JavaScript uporablja format s plavajočo vejico dvojne točnosti IEEE-754 za vse svoje numerične vrednosti (kasneje podpira tudi BigInt), vendar lahko drugi jeziki, ki implementirajo JSON, števila kodirajo drugače. znakovni niz: zaporedje nič ali več znakov Unicode. Znakovni nizi so ločeni z dvojnimi narekovaji in podpirajo poševnično ubežno skladnjo. Boolov: ena od vrednosti true ali false polje: urejeni seznam nič ali več elementov, od katerih je lahko vsak poljubnega tipa. Polja uporabljajo zapis v oglatih oklepajih z elementi, ločenimi z vejicami. objekt: zbirka parov ime-vrednost, kjer so imena (imenovana tudi ključi) znakovni nizi. Trenutni standard ECMA pravi: »Skladnja JSON ne nalaga nobenih omejitev znakovnim nizom, ki se uporabljajo kot imena, ne zahteva, da so znakovni nizi imen enolični, in ne pripisuje nobenega pomena vrstnemu redu parov ime/vrednost.« Objekti so ločeni z zavitimi oklepaji, pari pa se ločujejo z vejicami, znotraj vsakega para dvopičje »:« ločuje ključ ali ime od njegove vrednosti. null: prazna vrednost z uporabo besede null

Presledki so dovoljeni in prezrti okrog ali med skladenjskimi elementi (vrednosti in ločila, ne pa znotraj vrednosti znakovnega niza). Za presledke se v ta namen štejejo štirje specifični znaki: presledek, vodoravni tabulator, pomik v novo vrstico in pomik na začetek vrstice. Zlasti oznaka vrstnega reda bajtov ne sme biti ustvarjena s skladno implementacijo (čeprav je lahko sprejeta pri razčlenjevanju JSON). JSON ne ponuja skladnje za komentarje.

Zgodnje različice JSON (kot so določene v ) so zahtevale, da mora veljavno besedilo JSON vsebovati samo objekt ali tip polja, ki lahko vsebujeta druge tipe znotraj sebe. Ta omejitev je bila opuščena v , kjer je bilo besedilo JSON na novo definirano kot poljubna serializirana vrednost.

Števila v JSON so agnostična glede njihove predstavitve v programskih jezikih. Čeprav to omogoča serializiranje števil poljubne točnosti, lahko povzroči težave s prenosljivostjo. Ker na primer ni razlikovanja med celoštevilskimi in plavajočimi vrednostmi, lahko nekatere implementacije obravnavajo 42, 42.0, and 4.2E+1 kot isto število, druge pa ne. Standard JSON ne postavlja zahtev glede podrobnosti implementacije, kot so prekoračitev, podkoračitev, izguba točnosti, zaokroževanje ali predznačene ničle, vendar priporoča, da se za »dobro interoperabilnost« ne pričakuje več kot točnost IEEE 754 binary64. Pri serializiranju dvojiške predstavitve števila s plavajočo vejico na ravni stroja (kot je binary64) v človeku berljivo desetiško predstavitev (kot so števila v JSON) in nazaj ni inherentne izgube točnosti obstajajo objavljeni algoritmi za točno in optimalno izvedbo te pretvorbe.

Komentarji so bili namerno izključeni iz JSON. Leta 2012 je Crockford njihovo odločitev o zasnovi opisal takole: »Odstranil sem komentarje iz JSON-a, ker sem videl, da jih ljudje uporabljajo za shranjevanje ukazov za razčlenjevanje, kar bi uničilo interoperabilnost.«

JSON ne dovoljuje »zaključnih vejic« vejice za zadnjo vrednostjo znotraj podatkovne strukture. Zaključne vejice so pogosta značilnost izpeljank JSON za izboljšanje enostavnosti uporabe.

Interoperabilnost

opisuje nekatere vidike skladnje JSON, ki so sicer dovoljeni v skladu s specifikacijami, vendar lahko povzročijo težave z interoperabilnostjo. nekatere implementacije JSON sprejemajo samo besedila JSON, ki predstavljajo objekt ali polje. Zaradi interoperabilnosti bi morale aplikacije, ki si izmenjujejo JSON, prenašati sporočila, ki so objekti ali polja. specifikacije dovoljujejo objekte JSON, ki vsebujejo več članov z istim imenom. Obnašanje implementacij, ki obdelujejo objekte s podvojenimi imeni, je nepredvidljivo. Zaradi interoperabilnosti se morajo aplikacije pri prenosu objektov JSON izogibati podvojenim imenom. specifikacije izrecno določajo, da vrstni red članov v objektih JSON ni pomemben. Zaradi interoperabilnosti se morajo aplikacije izogibati dodeljevanju pomena vrstnemu redu članov, tudi če programska oprema za razčlenjevanje ta vrstni red naredi vidnega. čeprav specifikacije ne omejujejo velikosti ali točnosti številskih literalov JSON, jih pogosto uporabljena implementacija JavaScript shranjuje kot količine IEEE754 »binary64«. Zaradi interoperabilnosti se morajo aplikacije izogibati prenosu števil, ki jih ni mogoče predstaviti na ta način, na primer 1E400 ali 3,141592653589793238462643383279. čeprav specifikacije ne omejujejo kodiranja znakov Unicode v besedilu JSON, velika večina implementacij predvideva kodiranje UTF-8 zaradi interoperabilnosti bi morale aplikacije sporočila JSON vedno in samo kodirati v UTF-8. specifikacije ne prepovedujejo prenosa zaporedij bajtov, ki nepravilno predstavljajo znake Unicode. Zaradi interoperabilnosti bi morale aplikacije prenašati sporočila, ki ne vsebujejo takšnih zaporedij bajtov. specifikacija ne omejuje načina, kako aplikacije primerjajo znakovne nize Unicode. Zaradi interoperabilnosti bi morale aplikacije takšne primerjave vedno izvajati po posameznih kodnih enotah.