JSON

С Википедије, слободне енциклопедије

JSON, odnosno JavaScript Object Notation, je tekstualno baziran otvoreni standard dizajniran za razumljivu ljudima razmenu podataka. Ona je izvedena iz Javaskript jezika za predstavljanje jednostavnih struktura podataka i asocijativni niz, nazvan objektima. Uprkos vezi sa JavaSkriptom, to je jezički nezavistan, za mnoge jezike.

JSON format je prvobitno napravio Daglas Krokford, a opisan je u RFC 4627. Zvanična vrsta internet medija za JSON je application/json. Ekstenzija JSON fajlova je .json.

JSON format se često koristi za serijalizaciju i prenos strukturiranih podataka preko mrežne veze. Pre svega se koristi za razmenu podataka između servera i veb aplikacije, kao zamena za XML.

Istorija[уреди | уреди извор]

Daglas Krokford je prvi popularizovao JSON format.[1]

JSON je korišćen u State Software Inc., kompaniji čiji je suvlasnik Krokford, počev od aprila 2001., i finansiran do strane Tesla Ventures. Kada se šest bivših radnika Communities.com-a osnovali State Software Inc. početkom 2001., oni su se složili da naprave sistem koji će imati standardne pretraživačke sposobnosti i koji će obezbediti apstraktni nivo za veb programere da stvore veb aplikacije koje bi imale stalnu duplu konekciju na veb serveru držeći dve http konekcije otvorene i reciklirajući ih pre standardnog tajm-aut pretraživača ako se podaci više ne razmenjuju. Ideju za State Application Framework je razvio Čip Morningstar iz State Software Inc.[2][3] Korišćen je u projektima Communities.com za Cartoon Network, koji je koristio plug-in sa vlasničkim formatom razmenjivanja poruka zbog manipulacije DHTML elementima (ovaj sistem je takođe u vlasništvu 3DO). Nakon otkrića ranih AJAX sposobnosti, digiGroups, Noosh, i drugih korišćenih okvira za prosleđivanje informacija u polja u korisničkim pretraživačima bez osvežavanja veb aplikacije, realizujući u stvarnom vremenu bogate veb aplikacije koristeći jedino standarde HTTP, HTML i JavaSkript mogućnosti Netscape 4.0.5+ i IE 5+. Daglas Krokford je tada otkrio da JavaSkript može biti korišćen kao objektno zasnovan format za takav sistem. Sistem je prodat Sun Microsystems-u, Amazon.com-u i EDS-u. JSON.org Veb sajt je pokrenut 2002. U decembru 2005, Yahoo! je počeo da nudi nešto od veb servis JSON-u.[4] Google je počeo da nudi JSON-u novosti zaGData veb protokol u decembru 2006.[5]

Iako je JSON prvobitno zasnovan na ne-striktnom podskupu javaskript jezika za skriptovanje (konkretno, standard ECMA-262 treće izdanje-decembar 1999.[6]) a najčešće je korišćen sa tim jezikom, to je jezička nezavisnost format. Kod za raščlanjivanje i generisanje JSON podataka je lako dostupan za veliki broj programskih jezika. JSON veb sajt pruža sveobuhvatni spisak postojećih JSON biblioteka, organizovanih jezicima.

Tipovi podataka, sintaksa i primer[уреди | уреди извор]

Tipovi Java Script podataka su:

Beznačajne beline se mogu slobodno dodati između strukturalnih karaktera (zagrada "{ } [ ]", dve tačke ":" i zareza ",").

Sledeći primer pokazuje JSON reprezentaciju objekta koji opisuje osobu. Objekat ima polja ime i prezime predstavljena pomoću niske, broj za godinu, objekat koji prikazuje adresu te osobe i niz objekata sa brojevima telefona.

{
    "firstName": "John",
    "lastName": "Smith",
    "age": 25,
    "address": {
        "streetAddress": "21 2nd Street",
        "city": "New York",
        "state": "NY",
        "postalCode": 10021
    },
    "phoneNumbers": [
        {
            "type": "home",
            "number": "212 555-1234"
        },
        {
            "type": "fax",
            "number": "646 555-4567"
        }
    ]
}

Jedna potencijalna zamka za slobodnu prirodu JSON-a dolazi od mogućnosti pisanja brojeva kao numeričkih literala ili niske pod navodnicima. Na primer poštanski kod počinje sa nulama (na primer 011 za Beograd). Ako jedan programer piše pod navodnicima a drugi ne, vodeća nula se može izgubiti prilikom razmene ta 2 sistema, kada se traži u okviru istog sistema ili prilikom štampanja.Osim toga poštanski kodovi nisu u svim zemljama brojevi, neke koriste slova. Ovo je tip problema kada se korišćenje JSON šeme (vidi dole) treba umanjiti.

Od kada je JSON praktično podskup JavaScript-a, moguće je, ali se ne preporučuje,[7] parsiranje JSON teksta u objekat pozivanjem JavaScript-ove funkcije eval(). Na primer, ako je više JSON podataka sadržano u JavaScript string promenljivoj contact, može se napraviti JavaScript objekat p na sledeći način:

 var p = eval("(" + contact + ")");

Promenljiva contact mora se nalaziti u zagradama da bi se izbegla dvosmislenost sintakse JavaScript-a[8].

Preporučeni nacin je da se koristi JSON parser. Ukoliko klijent apsolutno veruje izvoru teksta ili mora parsirati i prihvatiti tekst koji nije striktno JSON kompatibilan, treba izbegavati eval().  Korektno implementirani JSON parser prihvata jedino validan JSON, sprečavajući potencijalno zlonameran kod od izvrsavanja nehotice.
 var p = JSON.parse(contact);

Šema[уреди | уреди извор]

JSON Šema[9] je specifikacija za formate zasnovane na JSON-u za definisanje strukture JSON podataka. JSON shema pruza garancije za sta su JSON podaci potrebni u datoj aplikaciji i kako se mogu menjati. JSON shema ima za cilj da obezbedi validaciju, dokumentaciju i kontrolu interakcije sa JSON podacima. JSON shema je bazirana na konceptima XML Schema, RelaxNG, and Kwalify, ali je namenjena da se bazira na JSON-u, kako bi se JSON podaci u formi sheme mogli koristiti za validaciju JSON podataka, isti alati za serijalizaciju/deserijalizaciju se mogu koristiti za šemu i podatke i to može biti samoopisujuće. JSON šema je napisana kao Internet nacrt , trenutna verzija 4[10]. Trenutno na raspolaganju postoji nekoliko validatora za različite programske jezike,[11] svaki sa različitim nivoom prilagođavanja. Primer JSON šeme:

{
    "name": "Product",
    "properties": {
        "id": {
            "type": "number",
            "description": "Product identifier",
            "required": true
        },
        "name": {
            "type": "string",
            "description": "Name of the product",
            "required": true
        },
        "price": {
            "type": "number",
            "minimum": 0,
            "required": true
        },
        "tags": {
            "type": "array",
            "items": {
                "type": "string"
            }
        },
        "stock": {
            "type": "object",
            "properties": {
                "warehouse": {
                    "type": "number"
                },
                "retail": {
                    "type": "number"
                }
            }
        }
    }
}

JSON šema iznad se može koristiti za testiranje validnosti sledećeg JSON koda:

{
    "id": 1,
    "name": "Foo",
    "price": 123,
    "tags": [ "Bar", "Eek" ],
    "stock": {
        "warehouse": 300,
        "retail": 20
    }
}

Mime verzija[уреди | уреди извор]

Oficijelna MIME verzija za JSON tekst je "aplikacija/json".[12]

JSON-RPC[уреди | уреди извор]

JSON-RPC je RPC protokol izgrađen na JSON, kao zamena za XML-RPC ili SOAP. To je jednostavan protokol koji definiše nekolicinu procesa i komandi. JSON-RPC dopušta notifikacije (informacija poslata do servera koja ne obavezuje odgovor) i za mnogostruke pozive da se pošalju do servera koji ce moći da uzvrati odgovorom na zahtev.

--> {"jsonrpc": "2.0", "method": "subtract", "params": [42, 23], "id": 1}
<-- {"jsonrpc": "2.0", "result": 19, "id": 1}

Upotreba u Ajax-u[уреди | уреди извор]

JSON-RPC je obično korišćen u Ajax tehnikama. Ajax je termin za mogućnost da veb strana zahteva da novi podatak, pošto bude učitan u internet pregledač, obično za odgovor na korisničke aktivnosti na prikazanoj veb strani. Kao deo Ajax modela, novi podatak je obično legalizovan u korisničkom sistemu prikazan dinamično i tako ide nazad do servera. Jedan primer ovoga u praksi može biti taj da dok korisnik kuca u pretraživaču, klijentov deo koda šalje ono što je otkucano do tad do servera koji odgovara sa kompletnom listom termina iz njihove baze podataka. Ovo može biti prikazano u padajućoj listi u pretrazi, tako da korisnik može zaustaviti kucanje i selektovati kompletnu i običnu pretragu povezanu direktno. Kada je ovo bilo u originalu opisano u mid-200s, Ajax je obično iskoristio XML kao podatak višestrukog formata, ali mnogi programeri su takođe koristili JSON da povežu Ajax-ove podatke sa serverom i klijentom.[13]

Prateći Java skript kod je jedan primer klijenta koji korišćenjem XMLHttpRequest zahteva podatak u JSON formatu od servera. (Serverov deo programiranja je izostavljen, mora biti podešen da odgovori na zahtev na url sa JSON-ovim formatiranom niskom.)

var my_JSON_object = {};
var http_request = new XMLHttpRequest();
http_request.open("GET", url, true);
http_request.onreadystatechange = function () {
    var done = 4, ok = 200;
    if (http_request.readyState == done && http_request.status == ok) {
        my_JSON_object = JSON.parse(http_request.responseText);
    }
};
http_request.send(null);

Bezbednosna pitanja[уреди | уреди извор]

Iako je JSON namenjen kao podatak serijalizovanog formata, njegov dizajn kao ne-strog podskup JavaSkript jezika poseduje nekoliko bezbednosnih problema. Ovo probleme koji je na usluzi JavaSkripta interpretira JSON tekst dinamicno kao JavaSkript koji izlaže program sa pogrešnim ili zlonamernim skriptama, a često je glavni problem kada se radi o podacima preuzetih sa interneta. Dok nije jedini način da se procesuira JSON, to je jedna laka i popularna tehnika koja proizilazi iz JSON-ove kompatibilnosti sa JavaSkriptovom eval() funkcijom i ilustrovana je sa pratećim primerima koda.

JavaSkript eval()[уреди | уреди извор]

Zato što mnogi JSON-ov formatirani tekst je takođe sintaksički legalan Java skript kod, jednostavan način za Java skript program da čita u JSON formatu podatke jeste da koristi sagrađenu JavaSkript eval() funkciju koja je dizajnirana da proceni JavaSkript izraze. Rađe nego da koristi JSON specifičan analizator, JavaSkript prevodilac koristi sebe da izvrši JSON podatke za proizvodnju JavaSkript objekata. Kako god, postoje Unicode karakteri koji su validne u JSON niskama, ali nisu validni u JavaSkriptu, pa dodatno bežanje može biti potrebno u nekim slučajevima pre korišćenja Java skript prevodioca.[14]

Osim ako su preuzete mere da se prvo proveri podatak, eval tehnika predlaže sigurnosne propuste ako celo Java skript okruženje nije zajedno pod kontrolom jednog pouzdanog izvora. Na primer, ako podatak sam sebi ne veruje može biti predmet zlonamernih Java skript kodova. Takođe, takva kršenja poverenje mogu kreirati ranjivosti za krađu podataka, autentifikaciju, falsifikovanje i druge potencijalne zloupotrebe podataka i resursa. Regularni izrazi mogu biti korišćeni za proveru podataka, pre nego da se pozivaju na eval. Na primer, RCF koji definiše JSON(RCF 4627) predlaže korišćene pratećeg koda da potvrdi JSON pre procenjivanja (promenljivi 'tekst' je ulaz Json):[15]

var my_JSON_object = !(/[^,:{}\[\]0-9.\-+Eaeflnr-u \n\r\t]/.test(
    text.replace(/"(\\.|[^"\\])*"/g, ''))) && eval('(' + text + ')');

Nova funkcija, JSON.parse(), je razvijena kao sigurnija alternativa funkcije eval. Posebno je namenjen za obradu JSON podataka, a ne Java skripta. Ona je prvobitno planirana za uključivanje u četvrto izdanje ECMASkript standarda,[16] ali se to nije desilo. Prvi put je dodat u petom izdanju,[17] i sada je podržan od strane velikih pretraživača datih u nastavku. Za starije, kompatibilna Java skript biblioteka je dostupna na JSON.org.

Kodiranje i dekodiranje u pretraživaču[уреди | уреди извор]

Nedavni Veb pretraživači sada imaju ili rade na maternjem JSON-u kodiranje/dekodiranje. Ne samo da ovo eliminiše navedeni eval() bezbednosni problem, nego i povećava osobine zbog činjenice da funkcionisanje više ne mora da se raščlani. Maternji JSON je generalno brži u odnosu na JavaSkript biblioteke korišćene ranije. Od juna 2009 sledeći pretraživači imaju ili će imati prirodnu podršku JSON-a, putem JSON.parse() i JSON.stringify():

Bar pet popularnih JavaSkript biblioteka su odani JSON-u:

Podrazumevano kodiranje za JSON je UTF8; takođe je podržano i UTF16 i UTF32.

Objekat reference[уреди | уреди извор]

JSON standard ne podržava reference objekta, ali Dojo Toolkit ilustruje kako može biti usvojena konvencija za podršku takve reference koristeći standarde JSON. Konkretno, dojox.json.ref modul obezbeđuje podršku za nekoliko oblika, uključujući upućivanje cirkularu, više unutrašnje poruke, i lenjem referenciranju.[27] Osim toga, postoje nestandardna rešenja kao što je korišćenje Mozilla JavaScript Sharp Variables, iako je ova funkcionalnost uklonjena u Firefox verziji 12.[28]

Poređenje sa drugim formatima[уреди | уреди извор]

JSON je promovisan kao alternativa za XML kao oba od ovih formata ima široku podršku za kreiranje, čitanje i dekodiranje u realnim situacijama u kojima se oni najčešće koriste.[29] Osim XML, primeri mogu uključiti OGDL, YAML and CSV. Takođe, Google Protocol Buffers mogu ispuniti tu ulogu, iako to nije jezik za razmenu podataka.

YAML[уреди | уреди извор]

YAML je skoro, ali ne u potpunosti, nadskup JSON-a, na primer, izbegavanje kose crte (/) sa obrnutom kosom crtom () vazi u JSON-u, ali ne važi u YAML-u. (To je uobičajena praksa kada ubrizgavanjem JSON-a u HTML radi zaštite od scripting napada). Ipak, mnogi YAML analizatori mogu prirodno raščlaniti izlaz iz mnogih JSON enkodera.[30]

XML[уреди | уреди извор]

XML je korišćen da opiše strukturirane podatke i da emituje objekte. Kada su podaci kodirani u XML-u, rezultat je obično veći od ekvivalentnog kodiranja u JSON-u, uglavnom zbog zatvaranja tagova XML-a. Ipak, ako se podaci sabijaju pomoću algoritma, kao gzip, postoji mala razlika, jer je kompresija dobra na uštedu prostora kada se obrazac ponavlja.

XML vrednosti nemaju određeni tip podataka.

Primeri[уреди | уреди извор]

JSON primer[уреди | уреди извор]

{
    "firstName": "John",
    "lastName": "Smith",
    "age": 25,
    "address": {
        "streetAddress": "21 2nd Street",
        "city": "New York",
        "state": "NY",
        "postalCode": "10021"
    },
    "phoneNumber": [
        {
            "type": "home",
            "number": "212 555-1234"
        },
        {
            "type": "fax",
            "number": "646 555-4567"
        }
    ]
}

Oba od sledećih primera nose istu vrstu informacija kao JSON primer na različite načine.

YAML primer[уреди | уреди извор]

JSON kod iznad je takođe 100% validan YAML; međutim, YAML koristi alternativnu sintaksu koja je razumljivija, menjanjem: {}, [], and " sa strukturnim razmakom.[30]

---
  firstName:  John
  lastName:  Smith
  age: 25
  address: 
        streetAddress: 21 2nd Street
        city: New York
        state: NY
        postalCode: 10021
    
  phoneNumber: 
        -  
            type: home
            number: 212 555-1234
        -  
            type: fax
            number: 646 555-4567

XML primeri[уреди | уреди извор]

<person>
  <firstName>John</firstName>
  <lastName>Smith</lastName>
  <age>25</age>
  <address>
    <streetAddress>21 2nd Street</streetAddress>
    <city>New York</city>
    <state>NY</state>
    <postalCode>10021</postalCode>
  </address>
  <phoneNumbers>
    <phoneNumber type="home">212 555-1234</phoneNumber>
    <phoneNumber type="fax">646 555-4567</phoneNumber>
  </phoneNumbers>
</person>
<person firstName="John" lastName="Smith" age="25">
  <address streetAddress="21 2nd Street" city="New York" state="NY" postalCode="10021" />
  <phoneNumbers>
     <phoneNumber type="home" number="212 555-1234"/>
     <phoneNumber type="fax"  number="646 555-4567"/>
  </phoneNumbers>
</person>

XML kodiranje može dakle biti uporedivo u dužini do ekvivalentnog JSON kodiranja. Širok spektar XML tehnologije obrade postoji, od Document Object Model-a do XPath-a i XSLT-a. XML može takođe biti stilizovan za neposredni prikaz koristeći CSS. XHTML je oblik XML tako da elementi mogu biti usvojeni u ovom obliku spremnom za direktno umetanje u veb stranice koje korišćenjem skriptovanja.

Vidi još[уреди | уреди извор]

Reference[уреди | уреди извор]

  1. ^ Video: Douglas Crockford — The JSON Saga Архивирано на сајту Wayback Machine (11. мај 2011), na Yahoo-u! U videu Krokford navodi:"Ja ne tvrdim da sam izmislio JSON ... Ono što sam ja uradio jeste: pronašao sam ga, dao mu ime, opisao kako je koristan. ... Dakle, ideja je bila tamo negde neko vreme. Ja sam dodao specifikaciju i malo veb strane."
  2. ^ „Čip Morningstar Biografija”. undated.  Проверите вредност парамет(а)ра за датум: |date= (помоћ)
  3. ^ „State Software Breaks Through Web App Development Barrier With State Application Framework: Softver omogućava prave interaktivne aplikacije; Zaista, smanjuje troškove i vreme potrebno za razvoj i unapređuje korisničko iskustvo”. PR Newswire. 12. 2. 2002. 
  4. ^ Yahoo!. „Korišćenje JSON-a sa Yahoo! veb servisom”. Архивирано из оригинала 11. 10. 2007. г. Приступљено 3. 7. 2009. 
  5. ^ Google. „Korišćenje JSON-a sa Google Data APIs”. Приступљено 3. 7. 2009. 
  6. ^ Crockford, Douglas (28. 5. 2009). „Predstavljanje JSON-a”. json.org. Приступљено 3. 7. 2009. 
  7. ^ JSON in JavaScript Архивирано на сајту Wayback Machine (10. јул 2016), on JSON's web page: "The eval function is very fast. However, it can compile and execute any JavaScript program, so there can be security issues [...]"
  8. ^ Crockford, Douglas (9. 7. 2008). „JSON in JavaScript”. json.org. Архивирано из оригинала 10. 7. 2016. г. Приступљено 8. 9. 2008. 
  9. ^ JSON Schema
  10. ^ JSON Schema draft 4
  11. ^ JSON Schema implementations
  12. ^ IANA | Application Media Types
  13. ^ Garrett, Jesse James (18. 2. 2005). „Ajax: Novi pristup veb aplikacijama”. Adaptive Path. Архивирано из оригинала 3. 11. 2013. г. Приступљено 19. 3. 2012. 
  14. ^ „JSON: Podskup JavaSkripta”. Magnus Holm. Архивирано из оригинала 13. 05. 2012. г. Приступљено 16. 5. 2011. 
  15. ^ Crockford, Douglas (jul 2006). „IANA Considerations”. aplikacija/json za JavaScript (JSON). IETF. sec. 6. doi:10.17487/RFC4627Слободан приступ. RFC 4627. Приступљено 21. 10. 2009. 
  16. ^ Crockford, Douglas (6. 12. 2006). „JSON: Alternativa za XML”. Приступљено 3. 7. 2009. 
  17. ^ „ECMAScript Fifth Edition” (PDF). Архивирано из оригинала (PDF) 12. 4. 2015. г. Приступљено 18. 3. 2011. 
  18. ^ „Using Native JSON”. 30. 6. 2009. Архивирано из оригинала 05. 03. 2012. г. Приступљено 3. 7. 2009. 
  19. ^ Barsan, Corneliu (10. 9. 2008). „Native JSON in IE8”. Приступљено 3. 7. 2009. 
  20. ^ „Web specifications supported in Opera Presto 2.5”. 10. 3. 2010. Архивирано из оригинала 12. 02. 2012. г. Приступљено 29. 3. 2010. 
  21. ^ Hunt, Oliver (22. 6. 2009). „Implement ES 3.1 JSON object”. Приступљено 3. 7. 2009. 
  22. ^ „YUI 2: JSON utility”. 1. 9. 2009. Архивирано из оригинала 12. 2. 2012. г. Приступљено 22. 10. 2009. 
  23. ^ „Učiti JSON”. 7. 4. 2010. Приступљено 7. 4. 2010. 
  24. ^ „Ticket #4429”. 22. 5. 2009. Архивирано из оригинала 12. 2. 2012. г. Приступљено 3. 7. 2009. 
  25. ^ „Ticket #8111”. 15. 6. 2009. Архивирано из оригинала 20. 02. 2012. г. Приступљено 3. 7. 2009. 
  26. ^ „Ticket 419”. 11. 10. 2008. Архивирано из оригинала 06. 11. 2018. г. Приступљено 3. 7. 2009. 
  27. ^ Zyp, Kris (17. 6. 2008). „JSON referencing in Dojo”. Приступљено 3. 7. 2009. 
  28. ^ „Sharp variables”. Архивирано из оригинала 06. 05. 2012. г. Приступљено 21. 4. 2012. 
  29. ^ „JSON: The Fat-Free Alternative to XML”. json.org. Приступљено 14. 3. 2011. 
  30. ^ а б YAML Version 1.2

Spoljašnje veze[уреди | уреди извор]