JSON - tekstualni format za razmenu podataka
Uvod
JSON (skraćeno od JavaScript Object Notation) je tekstualni format za predstavljanje i razmenu složenih podataka (u praktičnom smislu objekata), koji se definišu na sledeći način:
- složeni objekat zapisuje se kao kolekcija pojedinačnih podataka
- pojedinačni podaci zapisuju se u obliku parova ključ-vrednost
- "pojedinačni" podaci (u okviru JSON objekta), mogu zapravo biti i složeni objekti (nizovi, ugnežđeni JSON objekti i sl (ali, više o tome u nastavku))
Sam format nalikuje na sintaksu za definisanje objekata u JavaScript-u (iz očiglednih razloga), jednostavan je za razumevanje, pisanje i čitanje (bilo da čitanje/pisanje obavlja čovek ili računar) i, takođe, potpuno je transparentan (podaci zapisani u tekstualnom obliku su (razume se) direktno čitljivi).
JSON jeste ponikao iz jezika JavaScript, međutim, podrška za ovaj izuzetno popularni i široko rasprostranjeni format, odavno je prisutna i u brojnim drugim jezicima (PHP, Python, C#, Java, Android ....), i može se reći da JSON u ovom trenutku praktično predstavlja nezvanični standard za razmenu podataka između udaljenih računara (ili, između različitih programa na istom računaru), posebno kada su u pitanju web aplikacije.
Problematika razmene podataka na daljinu
JSON objekti su jednostavni za razumevanje (i mi se naravno nećemo "truditi da ih nepotrebno zakomplikujemo" :)), ali, prodiskutovaćemo ukratko o problematici razmene podataka u opštem smislu, to jest, o tome zašto se podaci - pogotovo kada je u pitanju razmena između udaljenih računara - tipično ne prenose u izvornom (binarnom) obliku:
- u različitim računarskim programima (koji su implementirani preko različitih programskih jezika), objekti se zapisuju na unapred utvrđen način, * ali, uglavnom se koriste binarni formati (što je logičan i ekonomičan izbor za zapis podataka u okviru jednog sistema)
- binarni formati u različitim programima (tj. informacionim sistemima), jesu uglavnom jasni i ekonomični, ali nisu ('obavezno') međusobno usaglašeni
- prenos podataka na daljinu, u izvornom (binarnom) obliku - jeste moguć, ali, nije praktičan i predstavlja sigurnosni rizik, budući da zapis nije transparentan **
Kada je u pitanju prenos podataka na daljinu, i budući da je format koji se koristi za slanje podataka od servera do klijenta (i obrnuto) - ionako običan tekst, format koji za zapisivanje (tj. razmenu) složenih objekata takođe koristi običan tekst (JSON), očigledno predstavlja praktično rešenje.
JSON format (predstavljanje podataka preko ključeva i vrednosti)
Budući da je JSON format sasvim jednostavan za razumevanje, pogledajmo odmah konkretan primer:
Opšte tehničke karakteristike JSON formata su sledeće:
- celokupan JSON objekat oivičen je vitičastim zagradama
- svaki pojedinačni podatak definisan je preko ključa (npr. "ime") i vrednosti koja je vezana za ključ ("Petar")
- nakon svakog para ključ-vrednost, osim poslednjeg, * navodi se zarez
- tekstualne vrednosti zapisuju se između znakova navoda, ** a brojčane vrednosti i drugi podržani osnovni tipovi podataka, zapisuju se bez znakova navoda (baš onako kako smo i inače navikli u programskim jezicima)
- pored pojedinačnih podataka, ključevi mogu biti vezani i za nizove i složene objekte (što ćemo prikazati u naredna dva odeljka) ***
U JSON objektima podržani su sledeći tipovi podataka:
- niske (beleže se između znakova navoda)
- brojevi (beleže se bez znakova navoda)
- Boolean vrednosti
true
ilifalse
(beleže se bez znakova navoda) null
(prazan objekat; beleži se bez znakova navoda)- nizovi i objekti (način beleženja biće objašnjen u odgovarajućim odeljcima)
Postupak kojim se stanje određenog objekta (ili neke druge strukture podataka) prevodi u JSON format, naziva se serijalizacija (termin koji nas podseća na to da je JSON objekat "samo niz znakova").
Postupak kojim se od JSON strukture kreira objekat ili neka druga binarna struktura podataka (u određenom programskom jeziku), naziva se deserijalizacija.
Zapisivanje nizova
Ukoliko je neko od svojstava potrebno zapisati kao niz (pojedinačnih podataka), koriste se uglaste zagrade (baš kao i inače, u velikoj većini programskih jezika):
Primer koji smo prikazali u prethodnom odeljku, proširićemo dodavanjem niza niski:
Ugnežđavanje složenih podataka
Kako u okviru JSON objekta zapisati strukturu koja sama po sebi predstavlja složenu kolekciju podataka?
Odgovor je: uz poštovanje pravila koja su već navedena, to jest, kao i svaki drugi par ključ-vrednost:
- ključ, tj. naziv objekta, zapisuje se između znakova navoda
- vrednost se (ovoga puta) zapisuje kao zaseban (ugnežđeni) JSON objekat
Da pojasnimo preko primera: celina koja sama po sebi predstavlja zaokružen JSON objekat ....
.... lako se može upisati u drugi JSON objekat (naravno, uz poštovanje svih do sada navedenih pravila):
U drugom primeru (u kome ćemo između ostalog dodatno objasniti smisao vrednosti null
), osvrnućemo se na situaciju u kojoj student: prelazi na postdiplomske studije, prestaje da bude asistent i menja adresu (tako da trenutno nisu dostupni podaci o novoj adresi).
U navedenim okolnostima, polje "adresa"
privremeno dobija vrednost null
(u smislu: "adresa ne postoji"), polje "postdiplomske_studije"
dobija vrednost true
, a polje "kursevi_asistent"
takođe dobija vrednost null
.
Budući da su se u međuvremenu pojavili i naučni radovi (koje treba uvrstiti), novi radovi će biti predstavljeni kao niz JSON objekata:
Verujemo da niste iznenađeni ni ovakvim ugnežđavanjem, jer - budući da je moguće da JSON objekti predstavljaju vrednosti u parovima ključ-vrednost - svakako nije iznenađujuće ni to što JSON objekti mogu predstavljati pojedinačne elemente nizova u JSON objektima.
U praksi ....
JSON, kao format za prenos (tj. razmenu) podataka, ima dobru podršku u svim popularnim programskim jezicima (što smo već nagovestili), a zarad ilustracije ćemo koristiti programske jezike Java i JavaScript, preko kojih ćemo razmotriti jednostavne primere serijalizacije i deserijalizacije.
Primeri iz programskog jezika Java
U programskom jeziku Java, za rad sa JSON objektima tipično se koristi popularna biblioteka GSON
.
Za pretvaranje Java objekta u JSON objekat, prvo je potrebno definisati klasu koja odgovara zahtevima zadatka (zarad preglednosti, nećemo navoditi sva polja) ....
.... potom je potrebno inicijalizovati objekat ....
.... posle čega se može kreirati objekat klase GSON
....
.... preko koga se obavlja serijalizacija objekta klase Student
.
Na jednostavan način (ukoliko je niska pravilno formatirana), proces se može 'obrnuti', odnosno, od JSON objekta može se dobiti Java objekat (postupkom deserijalizacije).
Primeri iz programskog jezika JavaScript
U JavaScript-u, konverzija podataka (očekivano) funkcioniše na jednostavniji način.
- Serijalizacija objekata (JS objekat -> JSON):
- Deserijalizacija/parsiranje (JSON -> JS objekat):
Preko JavaScript-a lako možete isprobati sve primere iz članka * (kao i druge primere koje možete zamisliti).
Za kraj ....
Čitaocima koji su dodatno zainteresovani za JSON objekte, ostavljamo da samostalno otkriju kako se u Javi (pri deserijalizaciji), rešava problem koji nastaje kada ključevi u JSON objektu ne odgovaraju poljima klase, kao i to da samostalno (u Javi ili nekom drugom programskom jeziku), napišu klasu kao što je GSON, sa funkcijama za pretvaranje objekata različitih klasa u JSON objekte i obrnuto.
O tome kako se JSON format koristi za razmenu podataka između različitih delova web aplikacija (što, kao što smo nagovestili na početku, sasvim verovatno predstavlja najčešći vid primene JSON formata u ovom trenutku), pisaćemo detaljnije u bliskoj budućnosti, u člancima koji će biti posvećeni implementaciji različitih delova web aplikacija (preko JavaScript-a, PHP-a, Node.JS-a i drugih tehnologija) ....