JSON (JavaScript Object Notation) ir ļoti daudzpusīgs un ļoti populārs datu formāts. To bieži izmanto saziņai starp tīmekļa lietotnēm, kā arī kā ērtu veidu, kā uzglabāt lielu daudzumu strukturētu lietojumprogrammu datu.
JSON ir tik noderīgs, ka gandrīz visas mūsdienu programmēšanas valodas nodrošina iebūvētu atbalstu darbam ar to, tostarp Go.
Darbs ar JSON pakalpojumā Go
Lielāko daļu darba, ko veiksit ar JSON, varat sadalīt divās vispārīgās kategorijās: sadalīšana un atdalīšana. Wikipedia definē šķirošanu kā:
Datorzinātnē kārtošana ir process, kurā objekta atmiņas attēlojums tiek pārveidots datu formātā, kas piemērots glabāšanai vai pārsūtīšanai. To parasti izmanto, ja dati ir jāpārvieto starp dažādām datorprogrammas daļām vai no vienas programmas uz citu.
Vienkāršāk sakot, šķirošana ir mainīgā saglabāto datu konvertēšana formā, kuru ir vieglāk nodot citai programmai. Atdalīšana ir apgriezts process: tas ietver transportēšanai formatētu datu paņemšanu un pārveidošanu programmai ērtāk lietojamā formā.
Izmantojot Go, varat sakārtot vietējās datu struktūras JSON. Varat arī veikt apgriezto darbību, atdalot JSON datus Go mainīgajos.
Pārsūtīšana uz JSON pakalpojumā Go
Go nodrošina kodēšanas/json pakotni lai atvieglotu darbu ar JSON. Šajā pakotnē ir vairākas funkcijas, taču tā, kuru izmantosit šķirošanai, ir maršals funkciju. maršals ir šāds funkcijas paraksts:
func Marshal (v saskarne{}) ([]baits, kļūda)
Tas nozīmē ka maršals pieņem jebkura datu tipa parametru un atgriež divas vērtības: baitu daļu un kļūdu. Citiem vārdiem sakot, jūs zvanāt maršals ar vērtību Go, un tas pārvērš to par JSON un atgriež JSON ekvivalentu. Ja konvertēšanas procesa laikā tiek konstatēta kļūda, tā atgriezīs kļūdu un tukšu daļu.
Šeit ir koda piemērs, kas tiek izmantots maršals lai karti pārvērstu par JSON. Lai palaistu šo piemēru, viss, kas jums nepieciešams, ir izveidot Go failu jūsu iecienītākais koda redaktors, vai izmantojiet Dodieties uz rotaļu laukumu:
iepakojums galvenais
imports (
"kodējums/json"
"fmt"
)func galvenais(){
val := karte [virkne]starpt{
"Džons": 25,
"Marija": 19,
"Ādams": 5,
}
res, _ := json. maršals (val)
fmt.Drukāt(virkne(res))
}
Ja palaižat šo kodu, tas izvadīs šādu informāciju:
Kā minēts iepriekš, jūs varat pārsūtīt jebkura veida Go datus uz JSON, lai gan reālajā dzīvē jūs parasti sadalīsit struktūras. Šī iemesla dēļ Go nodrošina funkciju, ko sauc par struct tagiem, kas ļauj jums sniegt maršals papildu instrukcijas konstrukciju konvertēšanai.
Struktūras tags ir virkne, ko iekļaujat savā struct deklarācijā blakus lauka datu veidam. Struktūras tagi ļauj pielāgot veidu maršals apstrādā lauku, kuram pieder atzīme. Varat izmantot struktūras tagus, lai pārdēvētu lauku JSON izvadē vai pat to pilnībā izlaistu. Strukturēt tagus (tas maršals atpazīst) sāciet ar apakšvirkni "json:".
Piemēram, pieņemsim, ka jums ir struktūra Automašīna kas atspoguļo informāciju par automašīnu. Šeit ir kods, lai izveidotu a Automašīna un nosūtīt to JSON:
iepakojums galvenais
imports (
"kodējums/json"
"fmt"
)
func galvenais(){
veids Automašīnas uzbūve {
Zīmola virkne
Modeļa virkne
Cena starpt
}
val := Automašīna{Zīmols: "Mercedes", Modelis: "Benz", Cena: 50 000}
res, _ := json. maršals (val)
fmt.Drukāt(virkne(res))
}
Šis kods rada izvadi:
The Zīmols, Modelis, un Cena lauki Automašīna jāsāk ar lielajiem burtiem vai maršals nevarēs tos pārvērst. Tā rezultātā JSON izvades lauki sākas arī ar lielajiem burtiem. Bet ko darīt, ja vēlaties, lai nosaukumi JSON failā sāktos ar mazajiem burtiem, vai ja vēlaties pilnībā pārdēvēt lauku? Šeit parādās struktūras tagi. Šeit ir piemērs:
iepakojums galvenais
imports (
"kodējums/json"
"fmt"
)
func galvenais(){
veids Automašīnas uzbūve {
ID int `json:"-"`
Zīmola virkne `json:"veids"`
Modeļa virkne `json:"modelis"`
Cena int `json:"cena"`
}
val := Automašīna{ID: 0, Zīmols: "Mercedes", Modelis: "Benz", Cena: 50 000}
res, _ := json. maršals (val)
fmt.Drukāt(virkne(res))
}
Šis kods ievieš jaunu ID lauku, kas maršals izlaiž no JSON izvades, izmantojot struct tagu. Kods izmanto arī struct tagus, lai pārdēvētu citus struct laukus. Šeit ir programmas izvade:
Kā redzat, struct taga daļa, kas seko "json:", kļūst par lauka nosaukumu Marshal izvadē. Ir viens izņēmums: ja tā ir virkne "-", Marshal izlaiž šo lauku no izvades. Vairāk par Marshal un struct tagiem varat lasīt vietnē Dodieties uz dokumentāciju.
Atdalīšana no JSON pakalpojumā Go
Kodēšanas/json pakotne nodrošina arī atdalīšanas funkciju, ko sauc Unmaršals. Tam ir šāds funkcijas paraksts:
func Unmarshal (datu []baits, v saskarne{}) kļūda
Atšķirībā no maršals, Unmaršals neatgriež vērtību. Tā vietā tas pieņem JSON kā baitu daļu pirmajā argumentā un pēc tam saglabā konvertētos datus objektā, uz kuru norāda tā otrais arguments. Unmaršals darbojas arī ar struct tagiem, bet šeit tagi stāsta Unmaršals kuri JSON lauki atbilst kuriem struct laukiem.
Atceļot sadali programmā, jūs varat izgūt datus no API, bet šeit jūs izmantosit fiktīvus datus. Lūk, kā jūs izmantojat Unmaršals:
iepakojums galvenais
imports (
"kodējums/json"
"fmt"
)func galvenais(){
veids Automašīnas uzbūve {
ID int `json:"-"`
Zīmola virkne `json:"veids"`
Modeļa virkne `json:"modelis"`
Cena int `json:"cena"`
}jsonInput := `{
"veids": "Toyota",
"modelis": "Camry",
"cena": 2000
}`var jsonOutput Car
kļūda := json. Unmarshal ([]baits(jsonInput), &jsonOutput)if err != nil {
fmt. Println("JSON atšifrēšanas kļūda!")
atgriezties
}
fmt.Drukāt(jsonOutput)
}
Šajā kodā tiek izmantots tas pats automašīnas tips kā iepriekšējā piemērā, un tas atdala JSON objektu konstrukcijā, kuras veids ir Car, un pēc tam izdrukā struktūrā esošos datus. Palaižot, programma rada šādu izvadi:
Tas parāda, ka fiktīvie JSON dati tika veiksmīgi atdalīti uz jsonOutput struktūra.
Go atvieglo darbu ar JSON
Izmantojot kodēšanas/json pakotni, darbs ar JSON pakalpojumā Go ir tikpat vienkāršs kā divu funkciju izsaukumi: Marshaland Unmarshal. Go arī ļauj pielāgot JSON kārtošanas/atdalīšanas procesu, izmantojot struct tagus.
Datu konvertēšana uz JSON ir lielisks veids, kā tos kopīgot ar citu programmu vai procesu. Formāts ir tik universāls, ka JSON ir tik pārnēsājams, cik vien iespējams.