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 jezicki 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 elemntima (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:

Bezznačajne beline se mogu slobodno dodati izmedju 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 mogucnosti pisanja brojeva kao numeričkih literala ili niske pod navodnicima. Na primer poštanski kod pocinje sa nulama (na primer 011 za Beograd). Ako jedan programer piše pod navodnicima a drugi ne, vodeca nula se moze 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šcenje JSON šeme (vidi dole) treba umanjiti.

Od kada je JSON prakticno 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 sledeci nacin:

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

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

Preporuceni 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, sprecavajuci 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 moze biti samoopisujucć. 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 razlicitim nivoom prilagodjavanja. 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 moze koristiti za testiranje validnosti sledećeg JSON koda:

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

Mime verzija[уреди]

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

JSON-RPC[уреди]

JSON-RPC je RPC protokol izgraden 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 moci 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 obicno korišcen u Ajax tehnikama. Ajax je termin za mogucnost da veb strana zahteva da novi podatak, pošto bude ucitan u internet pregledač, obično za odgovor na korisničke aktivnosti na prikazanoj veb strani. Kao deo Ajax modela, novi podatak je obicno 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živacu, 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 takodje 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 ilistrovana je sa pratećim primerima koda.

JavaSkript eval()[уреди]

Zato što mnogi JSON-ov formatirani tekst je takodje sintakstič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 proizvodju 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 slucajevima pre korišcenja 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. Takode, takva kršenja poverenje mogu kreirati ranjivosti za krađu podataka, audentifikaciju, falsifikovanje i druge potencijalne zloupotrebe podataka i resursa. Regularni izrazi mogu biti korišceni za proveru podataka, pre nego da se pozivaju na eval. Na primer, RCF koji definiše JSON(RCF 4627) predlaže korišcene 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 skripa. 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živaca 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 eleminiše navedeni eval() bezbednosni problem, nego i povećava osobine zbog činjenice da funkcionisanje više ne mora da se rasč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; takodje 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 obezbedjuje 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 Firevox verziju 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šce koriste.[29] Osim XML, primeri mogu uključiti OGDL, YAML and CSV. Takodje, 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 rasč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 moze 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.

Videti takođe[уреди]

Reference[уреди]

  1. ^ Video: Douglas Crockford — The JSON Saga, 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. 
  3. ^ „State Software Breaks Through Web App Development Barrier With State Application Framework: Softver omogućava prave interaktivne aplikacije; Zaista, smanjuje troskove 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“. Archived from the original on 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, 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 Приступљено 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 Приступљено 19. 3. 2012.. 
  14. ^ „JSON: Podskup JavaSkripta“. Magnus Holm Приступљено 16. 5. 2011.. 
  15. ^ Шаблон:Cite IETF
  16. ^ Crockford, Douglas (6. 12. 2006.). „JSON: Alternativa za XML“ Приступљено 3. 7. 2009.. 
  17. ^ „ECMAScript Fifth Edition“ Приступљено 18. 3. 2011.. 
  18. ^ „Using Native JSON“. 30. 6. 2009. Приступљено 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. Приступљено 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. Приступљено 22. 10. 2009.. 
  23. ^ „Učiti JSON“. 7. 4. 2010. Приступљено 7. 4. 2010.. 
  24. ^ „Ticket #4429“. 22. 5. 2009. Приступљено 3. 7. 2009.. 
  25. ^ „Ticket #8111“. 15. 6. 2009. Приступљено 3. 7. 2009.. 
  26. ^ „Ticket 419“. 11. 10. 2008. Приступљено 3. 7. 2009.. 
  27. ^ Zyp, Kris (17. 6. 2008.). „JSON referencing in Dojo“ Приступљено 3. 7. 2009.. 
  28. ^ „Sharp variables“ Приступљено 21. 4. 2012.. 
  29. ^ „JSON: The Fat-Free Alternative to XML“. json.org Приступљено 14. 3. 2011.. 
  30. ^ а б YAML Version 1.2

Spoljašnje veze[уреди]