JSON (JavaScript Object Notation) vrlo je svestran i vrlo popularan format podataka. Često se koristi za komunikaciju između web-aplikacija i kao prikladan način za pohranjivanje velikih količina strukturiranih podataka aplikacije.
JSON je toliko koristan da gotovo svi moderni programski jezici imaju ugrađenu podršku za rad s njim, uključujući Go.
Rad s JSON-om u Go
Većinu posla koji ćete raditi s JSON-om možete podijeliti u dvije opće kategorije: marshaling i unmarshaling. Wikipedia definira marshaling kao:
U informatici, marshaling je proces transformacije memorijske reprezentacije objekta u format podataka prikladan za pohranjivanje ili prijenos. Obično se koristi kada se podaci moraju premještati između različitih dijelova računalnog programa ili iz jednog programa u drugi.
Jednostavnije rečeno, marshaling je proces pretvaranja podataka pohranjenih u varijablu u oblik koji je lakše proslijediti drugom programu. Unmarshaling je obrnuti proces: uključuje uzimanje podataka formatiranih za prijenos i njihovo pretvaranje u oblik koji je vašem programu lakši za korištenje.
Koristeći Go, možete marširati izvorne strukture podataka u JSON. Možete izvršiti i obrnutu radnju, razvrstavajući JSON podatke u Go varijable.
Marshaling u JSON u Go
Go pruža kodiranje/json paket kako bismo vam olakšali rad s JSON-om. Ovaj paket sadrži nekoliko funkcija, ali ona koju ćete koristiti za marshaling je Maršal funkcija. Maršal ima sljedeći potpis funkcije:
funk maršal (v sučelje{}) ([]bajt, pogreška)
Ovo znači to Maršal prihvaća parametar bilo koje vrste podataka i vraća dvije vrijednosti: isječak bajtova i pogrešku. Drugim riječima, zovete Maršal s Go vrijednošću i pretvara ga u JSON i vraća JSON ekvivalent. Ako naiđe na pogrešku tijekom procesa konverzije, vratit će pogrešku i prazan isječak.
Evo primjera koda koji koristi Maršal za pretvaranje karte u JSON. Da biste pokrenuli ovaj primjer, sve što trebate je stvoriti Go datoteku u vaš omiljeni uređivač koda, ili koristite Idi na igralište:
paket glavni
uvoz (
"kodiranje/json"
"fmt"
)funk glavni(){
val := karta[niz]int{
"Ivan": 25,
"Marija": 19,
"Adam": 5,
}
res, _ := json. maršal (val)
fmt.Ispiši(niz(res))
}
Ako pokrenete taj kod, on će ispisati sljedeće:
Kao što je prije spomenuto, možete marširati bilo koju vrstu Go podataka u JSON, iako ćete u stvarnom životu obično marširati strukture. Zbog toga Go nudi značajku nazvanu struct tags koja vam omogućuje davanje Maršal dodatne upute za pretvaranje vaših struktura.
Oznaka strukture je niz koji uključujete u svoju deklaraciju strukture pored tipa podataka polja. Oznake strukture omogućuju vam prilagodbu načina Maršal tretira polje kojem oznaka pripada. Možete koristiti struct oznake za preimenovanje polja u JSON izlazu ili ga čak u potpunosti izostaviti. Oznake strukture (to Maršal prepoznaje) počinju podnizom "json:".
Kao primjer, recimo da imate strukturu Automobil koji predstavlja neke informacije o automobilu. Evo koda za stvaranje Automobil i marširajte ga u JSON:
paket glavni
uvoz (
"kodiranje/json"
"fmt"
)
funk glavni(){
tip Struktura automobila {
Žica robne marke
Model niza
Cijena int
}
val := Auto{Brand: "mercedes", Model: "Benz", Cijena: 50000}
res, _ := json. maršal (val)
fmt.Ispiši(niz(res))
}
Ovaj kod proizvodi izlaz:
The Marka, Model, i Cijena polja od Automobil treba započeti velikim slovima, odn Maršal neće ih moći pretvoriti. To rezultira time da izlazna polja JSON također počinju velikim slovima. Ali što ako želite da imena počinju malim slovima u JSON-u ili ako želite u potpunosti preimenovati polje? Tu na scenu dolaze struct oznake. Evo primjera:
paket glavni
uvoz (
"kodiranje/json"
"fmt"
)
funk glavni(){
tip Struktura automobila {
ID int `json:"-"`
Niz marke `json:"tip"`
Niz modela `json:"model"`
Cijena int `json:"cijena"`
}
val := Car{ID: 0, Marka: "mercedes", Model: "Benz", Cijena: 50000}
res, _ := json. maršal (val)
fmt.Ispiši(niz(res))
}
Ovaj kod uvodi novo ID polje koje Maršal izostavlja iz JSON izlaza putem oznake struct. Kod također koristi struct oznake za preimenovanje ostalih struct polja. Evo rezultata programa:
Kao što vidite, dio oznake struct nakon "json:" postaje naziv polja u Marshalovom izlazu. Postoji jedna iznimka: ako je to niz "-", Marshal izostavlja to polje iz izlaza. Više o oznakama Marshal i struct možete pročitati u Idi dokumentacija.
Unmarshaling iz JSON-a u Go
Encoding/json paket također nudi funkciju unmarshalinga, tzv Unmarshal. Ima sljedeći potpis funkcije:
func Unmarshal (podaci []bajt, v sučelje{}) pogreška
Za razliku od Maršal, Unmarshal ne vraća vrijednost. Umjesto toga, prihvaća JSON kao isječak bajtova u prvom argumentu, a zatim pohranjuje konvertirane podatke u objekt na koji ukazuje njegov drugi argument. Unmarshal radi i sa struct oznakama, ali ovdje oznake govore Unmarshal koja JSON polja odgovaraju kojim poljima strukture.
Prilikom demarshalinga u programu, mogli biste dohvaćanje podataka iz API-ja, ali ovdje ćete koristiti lažne podatke. Evo kako se koristi Unmarshal:
paket glavni
uvoz (
"kodiranje/json"
"fmt"
)funk glavni(){
tip Struktura automobila {
ID int `json:"-"`
Niz marke `json:"tip"`
Niz modela `json:"model"`
Cijena int `json:"cijena"`
}jsonInput := `{
"tip": "Toyota",
"model": "Camry",
"cijena": 2000
}`var jsonOutput Car
pogreška := json. Unmarshal([]bajt(jsonInput), &jsonOutput)if err != nula {
fmt. Println("Pogreška dekodiranja JSON-a!")
povratak
}
fmt.Ispiši(jsonOutput)
}
Ovaj kod koristi isti tip Car kao i prethodni primjer i demaršira JSON objekt u strukturu tipa Car, a zatim ispisuje podatke u strukturi. Kada se pokrene, program proizvodi ovaj izlaz:
Ovo pokazuje da su lažni JSON podaci uspješno uklonjeni u mapu jsonOutput strukturirati
Go olakšava rad s JSON-om
S paketom encoding/json, rad s JSON-om u Gou jednostavan je kao dva poziva funkcije: Marshaland Unmarshal. Go također omogućuje prilagodbu procesa marshalinga/unmarshalinga JSON-a pomoću struct oznaka.
Pretvaranje podataka u JSON izvrstan je način dijeljenja s drugim programom ili procesom. Format je toliko univerzalan da je JSON maksimalno prenosiv.