Uvod
Definisaćemo na početku problematiku slanja složenih podataka (celokupnog stanja objekata određenih klasa, nizova, lista i drugih složenih struktura) na daljinu:
- Objekti u računarskim programima su (u kontekstu ovog članka), kolekcije podataka istog ili različitog tipa i njihov način zapisivanja je dobro utvrđen i opšte poznat (objekti, odnosno klase takođe sadrže i metode, funkcije čija je svrha manipulacija navedenim podacima (o svemu ovome možete se detaljnije obavestiti u članku o objektno orijentisanom programiranju), ali, to u kontekstu ovog članka nije od važnosti)
- Prenos ovakvih podataka na daljinu, u izvornom (binarnom) obliku, jeste moguć, ali - nije praktičan. Zatvoreni binarni formati izazivaju (reklo bi se, sa punim pravom) strepnju kod administratora mrežnih sistema i ostavljaju mogućnost različitih vrsta zloupotrebe.
Format koji se tipično koristi za prenos složenih strukra podataka je, u osnovnom tehničkom smislu, isti format kojim se informacije i inače prenose od servera do klijenta, a to je - običan tekst, pa je, dakle, prvo pitanje: kako ćemo predstaviti objekte korišćenjem teksta, da bismo omogućili njihov prenos na daljinu?
Predstavljanje preko ključa i vrednosti
JSON (JavaScript Object Notation) je format za prenos i razmenu podataka u kome se podaci prestavljaju u tekstualnom obliku. Jednostavan je za pisanje, čitanje (bilo da taj posao obavlja čovek ili računar), razumevanje (doduše, našao bi se već neko od mlađih programera ko bi ovu poslednju tvrdnju doveo u pitanje:) ) i potpuno transparentan (otvoren, tekstualni format koji je sagledljiv u izvornom obliku).
Napomenimo da, iako JSON jeste iznikao iz JavaScript jezika, njegova primena odavno prevazilazi te prvobitne okvire i obuhvata podršku za brojne programske jezike (Python, Java, Android ....), kao i to da, iako se ovakav format tipično koristi za slanje podataka na daljinu, to ipak nije jedina oblast primene ovog formata.
JSON objekti se formatiraju na sledeći način:
- Objekat čija svojstva želimo da definišemo, oivičićemo vitičastim zagradama
- Svako svojstvo biće definisano preko ključa (leva strana koja imenuje svojstvo, u našem slučaju "ime") i vrednosti koja je zapisana sa desne strane, posle znaka ":"
- Tekstualne vrednosti zapisuje se između znaka navoda, dok se brojčane navode bez znakova navoda - baš onako kako smo i inače navikli u programiranju
- Postupak kojim se stanje određenog objekta (ili neka druga struktura podataka) prevodi u JSON objekat, naziva se serijalizacija (termin koji nas upućuje na to da je JSON objekat ipak ("samo") niz znakova)
- Analogno tome, postupak kojim se od JSON strukture kreira objekat neke klase ili neka druga struktura podataka naziva se deserijalizacija.
{
"ime" : "Vasilije"
}
{
"visina" : 168
}
Ukoliko objekat ima više svojstava, za razdvajanje se koristi znak zarez.
{
"ime" : "Ivana",
"prezime" : "Stojanović",
"email" : "ivana_s_04@gmail.com",
"godiste" : 2004
}
Ukoliko je potrebno zapisati neko od svojstava (u našem primeru, to su omiljni_filmovi), kao niz podataka, koristićemo uglaste zagrade kakve i inače u programiranju koristimo za nizove.
{
"ime" : "Ivana",
"prezime" : "Stojanović",
"email" : "ivana_s_04@gmail.com",
"godiste" : 2004,
"filmovi" : ["Munje",
"Lavirint",
"Sedam i po"]
}
Na kraju, šta ćemo uraditi ukoliko je neki od podataka koje želimo zapisati sam po sebi složen podatak? Poštovaćemo pravila koja smo već naveli: tretiraćemo dato svojstvo kao i svaki drugi ključ-vrednost par, tako da će ključ biti zapisan izmeću znakova navoda, ali će vrednost ovoga puta biti zapisana kao zaseban JSON objekat.
{
"drzava" : "Srbija"
"grad" : "Beograd"
"ulica" : "Grofa Drakule"
"broj" : 41
}
{
"ime" : "Ivana",
"prezime" : "Stojanović",
"adresa" : {
"drzava" : "Srbija"
"grad" : "Beograd"
"ulica" : "Grofa Drakule"
"broj" : 41
},
"email" : "ivana_s_04@gmail.com",
"godiste" : 2004,
"filmovi" : [
"Munje",
"Lavirint",
"Sedam i po"
]
}
U praksi ....
JSON kao format podataka za prenos i razmenu, ima dobru podršku u svim popularnim programskim jezicima. Za primer ćemo uzeti programski jezik Java i koristićemo popularnu biblioteku GSON.
Pre nego što se pozabavimo pretvaranjem Java objekta u JSON objekat, definisaćemo klasu koja odgovara našim zahtevima .....
public class Osoba {
private String ime;
private String prezime;
private String email;
private int godina_rodjenja;
public Osoba(String ime, String prezime, String email, int godina_rodjenja) {
this.ime = ime;
this.prezime = prezime;
this.email = email;
this.godina_rodjenja = godina_rodjenja;
}
}
.... inicijlaizovati objekat ove klase ......
Osoba osoba = new Osoba("Ivana", "Stojanović", "ivana_s_04@gmail.com", 2004);
.... i na kraju kreirati GSON objekat koji će pretvoriti naš Java objekat u JSON objekat (postupkom serijalizacije koji smo pomenuli na početku članka):
Gson gson = new Gson();
String json = gson.toJson(osoba);
Niska json sada ima isti sadržaj kao JSON objekat sa slike 3. iz ovog članka. Ono što je najzanimljivije u ovoj situaciji, je to da su ključevi automatksi dobijeni iz naziva polja klase.
Na jednostavan način (ukoliko je niska pravilno formatirana), od JSON objekta dobićemo Java objekat (pomenuti postupak deserijalizacije).
Osoba osoba2 = gson.fromJson(json, Osoba.class);
Učenicima koji su više zainteresovani za ovu oblast, ostavljamo da samostalno otkriju kako se rešava problem koji nastaje kada ključevi u JSON objektu ne odgovaraju poljima klase, kao i to da samostalno napišu klasu kao što je GSON, sa funkcijama za pretvaranje Java objekata u JSON objekte i obrnuto.