nav_dugme codeBlog codeBlog
  • početna Početna stranica
  • Sačuvani članci Sačuvani članci
  • Članci
     (spisak)
  • Kontakt
Povratak na vrh stranice

Info & povezani članci Info o članku - dugme

Info

trejler_sat Datum objave: 22.07.2020.

trejler_dokument Jezici: JavaScript,
Java

trejler_teg_narandzasti Težina: 6/10

json
JavaScript
Java
web dizajn
internet
baze podataka
jwt
strukture podataka
teorija

Povezani članci

Uvod u JavaScript i DOM (Document Object Model)Operacije sa nizovima u programskom jeziku JavaScriptOperacije sa tekstualnim datotekama u programskim jezicima C i PythonJSON Web Token (JWT) - Struktura i primena u oblasti autorizacije web aplikacijaUvod u web dizajn - 1. deo - Početni koraciUvod u relacione baze podataka i SQLUvod u PythonŠablonske niske u programskim jezicimaJavaScript ES6 sintaksaIzbor prvog programskog jezikaASCII, Unicode i UTF - Predstavljanje znakova na računarimaGNU/Linux - 1. deo - Uvod
Svi članci
For a successful technology, reality must take precedence over public relations, for nature cannot be fooled.
Richard Feynman

JSON - tekstualni format za razmenu podataka

Facebook LinkedIn Twitter Viber WhatsApp E-mail
zoom_plus zoom_minus bookmark
početna > Članci > Teorija

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 formatu ključ-vrednost
  • "pojedinačni" podaci (u okviru JSON objekta), mogu zapravo biti i složeni objekti (nizovi, ugnežđeni JSON objekti i sl)

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 je potpuno 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 nećemo se naravno "truditi da ih nepotrebno zakomplikujemo" :)), ali, prvo ćemo ukratko prodiskutovati 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.

* U opštem smislu, kao što znamo, objekti (odnosno klase), takođe sadrže i metode za manipulaciju podacima (o čemu po potrebi možete pročitati više u članku o objektno orijentisanom programiranju), ali, u kontekstu trenutne diskusije o formatu JSON, metode nisu od važnosti.

** U praktičnom smislu, može se reći da je podozrivost prema zatvorenim formatima (pogotovo u kontekstu slanja podataka na daljinu), krajnje opravdana.

Takođe, može se reći i da je JSON ("u istorijskom smislu"), zamena za nekadašnje (ne baš mnogobrojne) tekstualne formate za razmenu podataka, pre svega XML, pomalo zastareo format koji se i dalje ponegde sreće.

(Na XML ćemo se osvrnuti u jednom od budućih članaka koji će za temu imati AJAX, tehniku za neupadljivo osvežavanje delova web stranica.)

JSON format (predstavljanje podataka preko ključeva i vrednosti)

Budući da je format JSON objekata sasvim jednostavan za razumevanje, pogledajmo odmah konkretan primer:

		
{
	"ime":                   "Petar",
	"prezime":               "Marković",
	"email":                 "p_markovic@xyzf.bg.ac.rs",
	"datum_rođenja":         "06.04.1995.",
	"prosek_ocena":          9.21,
	"redovan_student":       true,
	"postdiplomske_studije": false,
	"objavljeni_radovi":     null
}
		
	
Slika 1. - Primer JSON objekta koji sadrži više podataka o određenoj osobi/studentu (različita svojstva su odvojena zarezima).

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) ***

* Da dodatno preciziramo, nakon poslednjeg para ključ-vrednost, ne sme biti naveden zarez.

** Za niske u JSON objektima koriste se "baš" znaci navoda (to jest, ne koriste se apostrofi).

*** U slučajevima kada je vrednost (u paru "ključ-vrednost"), složeni objekat, takođe se primenjuju prethodno navedena pravila o upotrebi zareza.

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 ili false (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.

Usputna napomena: JSON format ne podržava upotrebu komentara (ukoliko je potrebno uvrstiti komentar u određeni JSON objekat, komentar mora biti formatiran kao i bilo koji drugi podatak, po obrascu "ključ-vrednost").

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):

		
{
	"niz_1" : [ 1 , 2 , 3 , 4 , 5 ],
	"niz_2" : [ "jedan", "dva", "tri sedmine" ]
}
		
	
Slika 2. - Primer zapisivanja elementarnih nizova preko JSON formata.

Primer koji smo prikazali u prethodnom odeljku, proširićemo dodavanjem niza niski:

		
{
	"ime":                   "Petar",
	"prezime":               "Marković",
	"email":                 "p_markovic@xyzf.bg.ac.rs",
	"datum_rođenja":         "06.04.1995.",
	"prosek_ocena":          9.21,
	"redovan_student":       true,
	"postdiplomske_studije": false,
	"objavljeni_radovi":     null,

	"kursevi_asistent": [
		"Osnove programiranja",
		"Uvod u Javu",
		"Uvod u Python"
	]
}
		
	
Slika 3. - JSON objekat, sa svojstvom čija vrednosti predstavlja niz niski.

Kursevi na kojima je student angažovan u svojstvu asistenta, dodati su među podatke i predstavljeni kao niz.

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 ....

		
{
	"država": "Srbija",
	"grad":   "Beograd",
	"ulica":  "Grofa Drakule",
	"broj":   41
}
		
	
Slika 4. - Zaseban JSON objekat koji sadrži detaljno zapisanu adresu.

.... lako se može upisati u drugi JSON objekat (naravno, uz poštovanje svih do sada navedenih pravila):

		
{
	"ime":     "Petar",
	"prezime": "Marković",
	
	"adresa":  {
		"država": "Srbija",
		"grad":   "Beograd",
		"ulica":  "Grofa Drakule",
		"broj":   41
	},
    
	"email":                 "p_markovic@xyzf.bg.ac.rs",
	"datum_rođenja":         "06.04.1995.",
	"prosek_ocena":          9.21,
	"redovan_student":       true,
	"postdiplomske_studije": false,
	"objavljeni_radovi":     null,

	"kursevi_asistent": [
		"Osnove programiranja",
		"Uvod u Javu",
		"Uvod u Python"
	]
}
		
	
Slika 5. - Složeni JSON objekat, sa svojstvom čija je vrednost - JSON objekat sa slike #4.

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.

U idejnom smislu, jedna od mogućnosti za polje "kursevi_asistent" jeste to da polje dobije vrednost praznog niza, pri čemu bi se preko (drugog) zasebnog polja beležili kursevi na kojima je student/asistent ranije bio angažovan (ali, pošto primer nema pravu upotrebnu vrednost - "nećemo komplikovati"). :)

Ako zamislimo da su se u međuvremenu pojavili i naučni radovi (koje treba uvrstiti), novi radovi mogu se predstaviti kao niz JSON objekata:

		
{
	"ime":                   "Petar",
	"prezime":               "Marković",
	"adresa":                null,
	"email":                 "p_markovic@xyzf.bg.ac.rs",
	"datum_rođenja":         "06.04.1995.",
	"prosek_ocena":          9.21,
	"redovan_student":       true,
	"postdiplomske_studije": true,

	"objavljeni_radovi": [
		{
			"naziv":  "Projektovanje baza podataka",
			"datum":  "09.10.2019.",
			"mentor": "Prof. Dr Milan Adamović"
		},
		{
			"naziv":  "Open-source prevodioci",
			"datum":  "21.03.2020.",
			"mentor": "Prof. Dr Jelena Zec"
		}
	]
}
		
	
Slika 6. - Složeni JSON objekat, sa svojstvom čija je vrednost - 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 drugim JSON objektima.

U praksi ....

U svojstvu 'nezvaničnog formata za razmenu podataka između raznolikih programa i udaljenih računara', JSON ima dobru podršku u svim popularnim programskim jezicima (što smo već nagovestili), a zarad ilustracije ćemo koristiti primere iz programskih jezika Java i JavaScript, preko kojih ćemo razmotriti jednostavne primere serijalizacije i deserijalizacije.

Javu koristimo kao primer jezika u kome se zadaci vezani za JSON objekte (a naravno i inače) obavljaju na "zvaničan" način, dok ćemo JavaScript koristiti kao primer jezika u kome se manipulacija JSON objektima obavlja na znatno "komotniji" način.

Primeri iz programskog jezika Java

U programskom jeziku Java, za obavljanje operacija 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) ....

		
public class Student {
	private String    ime;
	private String    prezime;
	private String    email;
	private LocalDate datum_rodjenja;
	
	public Student(String ime, String prezime, String email, int godina_rodjenja) {
		this.ime             = ime;
		this.prezime         = prezime;
		this.email           = email;
		this.godina_rodjenja = godina_rodjenja;
	}
}
		
	
Slika 7. - Klasa zapisana u programskom jeziku Java, koja sadrži polja koja odgovaraju JSON objektu sa početka teksta.

.... potom je potrebno inicijalizovati objekat ....

		
LocalDate datum_rodjenja = LocalDate.of(1997, 4, 6);
Student student = new Student("Petar", "Marković", "p_markovic@xyzf.bg.ac.rs", datum_rodjenja);
		
	
Slika 8. - Kreiranje objekta klase Student.

.... posle čega se može kreirati objekat klase GSON ....

		
Gson gson = new Gson();
		
	
Slika 9. - Instanciranje objekta klase Gson.

.... preko koga se obavlja serijalizacija objekta klase Student.

		
String json = gson.toJson(student);
		
	
Slika 10. - Pretvaranje Java objekta u JSON objekat.

Niska json sada ima sadržaj po uzoru na JSON objekat sa slike #1 iz ovog članka.

(Ako želite da sadržaj bude identičan, dodajte i ostala polja i prepravite konstruktor klase, a zanimljivo je primetiti i to da su ključevi automatski dobijeni iz naziva polja klase.)

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).

		
Student student_2 = gson.fromJson(json, Student.class);
		
	
Slika 11. - Pretvaranje JSON objekta (praktično - niske znakova), u Java objekat.

Primeri iz programskog jezika JavaScript

U JavaScript-u, konverzija podataka (očekivano) funkcioniše na jednostavniji način, što možemo prikazati preko sledećih primera:

- Serijalizacija objekata (JS objekat -> JSON):

		
let O_1 = {
	ime:             "Petar",
	prezime:         "Marković",
	prosek_ocena:    9.21,
	redovan_student: true,
};

let JSON_1 = JSON.stringify(O_1);
console.log(JSON_1);
		
	
Slika 12. - Primer serijalizacije JSON objekta u programskom jeziku JavaScript.

- Deserijalizacija/parsiranje (JSON -> JS objekat):

		
let JSON_2 = `
{
	"ime":             "Petar",
	"prezime":         "Marković",
	"prosek_ocena":    9.21,
	"redovan_student": true
}
`;

let O_2 = JSON.parse(JSON_2);
console.log(O_2);
		
	
Slika 13. - Primer deserijalizacije JSON objekta u programskom jeziku JavaScript.

Preko JavaScript-a lako možete isprobati sve primere iz članka * (kao i druge primere, koje, po želji, možete sami osmisliti).

* Svakako je lakše u odnosu na isprobavanje primera u Javi. :)

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) ....

Autor članka Nikola Vukićević Za web portal codeblog.rs
Napomena: Tekstovi, slike, web aplikacije i svi ostali sadržaji na sajtu codeblog.rs (osim u slučajevima gde je drugačije navedeno) predstavljaju intelektualnu svojinu autora sajta codeblog.rs i zabranjeno je njihovo korišćenje na drugim sajtovima i štampanim medijima, kao i bilo kakvo drugo korišćenje u komercijalne svrhe, bez eksplicitnog pismenog odobrenja autora.
© 2020-2026. Sva prava zadržana.
Facebook LinkedIn Twitter Viber WhatsApp E-mail
početna > Članci > JSON - tekstualni format za razmenu podataka
codeBlog codeBlog
Sajt posvećen popularizaciji kulture i veštine programiranja.
Napomena: Tekstovi i slike na sajtu codeblog.rs (osim u slučajevima, gde je drugačije navedeno) predstavljaju intelektualnu svojinu autora sajta codeblog.rs i zabranjeno je njihovo korišćenje na drugim sajtovima i štampanim medijima, kao i bilo kakvo drugo korišćenje u komercijalne svrhe, bez eksplicitnog odobrenja autora.
© 2020-2026. Sva prava zadržana.
Facebook - logo
Instagram - logo
LinkedIn - logo
Twitter - logo
E-mail
Naslovna
   •
Uslovi korišćenja
   •
Obaveštenja
   •
FAQ
   •
Kontakt