Înțelegerea JSON

JSON (Jurnal de obiect JavaScript, pe care îl pronun pe "Jason" și pe care îl puteți pronunța oricum doriți) este un format de date bazat pe text care este proiectat să fie ușor de citit de om, ușor și ușor de transmis între un server și un client web. Sintaxa sa derivă din JavaScript - de aici și numele - dar poate fi folosit în majoritatea limbilor, inclusiv AS3 și C #.


Arrays

Dacă ați făcut mult programare, veți fi întâlnit cu agregate înainte: colecții de articole, fiecare atribuită unui întreg întreg.

În JSON, o serie de primele șase litere ale alfabetului ar fi reprezentate astfel:

 ["a", "b", "c", "d", "e", "f"]

Coderii AS3 și JavaScript vor găsi lista de mai sus foarte familiarizată. Este similar cu modul C # de definire a unei matrice.

După cum probabil puteți ghici, parantezele pătrate spun "aceasta este o matrice", iar virgulele sunt folosite pentru a separa diferite elemente (rețineți că nu există virgule după elementul final). Presupunând limba în care parcurgeți, JSON utilizează matricele bazate pe zero (și câte limbi nu face, aceste zile?), elementul 0 va fi "a", 1 va fi "b", 2 va fi "c" și așa mai departe.

Pentru a face citirile mai ușor de citit, le vom scrie adesea cu extralineslines și indentation:

 ["a", "b", "c", "d", "e", "f"]

Rețineți că nu există încă virgulă după elementul final, deci acum pare un pic ciudat.

Nu trebuie să folosim șiruri ca elemente ale unei matrice JSON; putem folosi și numere, Adevărat, fals, și nul. Nu există o tastare strictă, ceea ce înseamnă că puteți amesteca tipurile de valori pe care le utilizați în orice matrice dată. De exemplu, acest lucru este perfect valabil:

 ["măr", 3, 912, nulă, -7.2222202, "#", adevărat, fals]

Rețineți că trebuie să utilizați ghilimele duble (") pentru a înconjura toate șirurile; citate unice (') nu sunt permise. Da, acesta este cazul, chiar dacă JavaScript vă permite să închideți șiruri de caractere în oricare tip de cotație. Dacă doriți să utilizați ghilimele în interiorul șirurilor JSON, utilizați \“ in schimb.


Obiecte

O matrice este o colecție de elemente în care fiecare este atribuit unui întreg întreg. Un obiect este o colecție de elemente în care fiecare este atribuit unui anumit şir. Elementele sunt apelate valorile, iar corzile utilizate pentru a le identifica sunt chemați chei. Unele limbi de programare numesc acest tip de structură de date a hash table sau hartă hash.

Am putea reprezenta vârstele oamenilor într-un obiect cum ar fi:

 "Alan": 44, "John": 58, "Brian": 19, "Eliza": 4, "Jessie"

Curbele curbate spun "acesta este un obiect", și - ca și în cazul tablourilor - virgulele separă elemente diferite. Cu toate acestea, elementele sunt date în perechi, de data asta. Este mai ușor să vedem dacă adăugăm câteva linii noi și indentare:

 "Alan": 44, "John": 58, "Brian": 19, "Eliza": 4, "Jessie"

În fiecare pereche, un colon separă cheia (care este un șir) de valoare (care, în acest caz, este un număr). Când făceam o matrice, nu era nevoie să precizăm care intregul element a fost atribuit fiecărui element (adică am fost nevoiți doar să specificăm valorile și nu cheile), deoarece au fost atribuite în funcție de ordinea în care au fost înscrise matricea.

Mai degrabă decât să solicitați al doilea sau al cincilea element, așa cum ați proceda la accesarea unei matrice, cu un obiect, veți solicita elementul "Alan" sau "Eliza".

Pentru a face lucrurile mai confuze, obiectele vă permit de asemenea să utilizați șiruri ca valori - nu doar cheile. Deci ai putea avea un astfel de obiect:

 "Activetuts +": "http://activ.tutsplus.com/", "Psdtuts +": "http://psd.tutsplus.com/", "Nettuts +": "http://net.tutsplus.com/ "," Aetuts + ":" http://ae.tutsplus.com/ "," Vectortuts + ":" http://vector.tutsplus.com/ "," Audiotuts + ":" http://audio.tutsplus.com / "," Cgtuts + ":" http://cg.tutsplus.com/ "," Phototuts + ":" http://photo.tutsplus.com/ "," Webdesigntuts + ":" http: //webdesign.tutsplus. com / "," Mobiletuts + ":" http://mobile.tutsplus.com/ "

În acest fel, pentru a prelua adresa URL pentru un anumit site Tuts +, îl puteți solicita folosind numele site-ului drept cheie. Cu toate acestea, inversul nu este adevărat - nu puteți folosi "http://cg.tutsplus.com/" pentru a prelua "Cgtuts +".

Aceleași reguli privind diferitele tipuri de citate se aplică obiectelor în ceea ce privește matricea. Obiectele pot folosi și șiruri, numere, Adevărat, fals, și nul ca valori (dar numai șiruri ca chei).


Nesting

Obiectele și matricele pot, de asemenea, să stocheze alte obiecte și tablouri. Acest lucru ne permite să creăm structuri de date imbricate; de exemplu:

 "Activetuts +": "url": "http://activ.tutsplus.com/", "arePremium": true, "Psdtuts +": "url": "http://psd.tutsplus.com/ "," Prelude ":" true "," Nettuts + ": " url ":" http://net.tutsplus.com/ "," //ae.tutsplus.com/ "," arePremium ": true," Vectortuts + ": " url ":" http://vector.tutsplus.com/ "," hasPremium ": true," Audiotuts + "url": "http://audio.tutsplus.com/", "hasPremium": true, "Cgtuts +": "url": "http://cg.tutsplus.com/", " : true, "Phototuts +": "url": "http://photo.tutsplus.com/", "hasPremium": true, "Webdesigntuts +": "url": "http: //webdesign.tutsplus .com / "," arePremium ": false," Mobiletuts + ": " url ":" http://mobile.tutsplus.com/ "," arePremium ": false

Să vedem asta cu puțin spațiu:

 "Activetuts +": "url": "http://activ.tutsplus.com/", "arePremium": true, "Psdtuts +": "url": "http://psd.tutsplus.com/ "," Prelude ":" true "," Nettuts + ": " url ":" http://net.tutsplus.com/ "," //ae.tutsplus.com/ "," arePremium ": true," Vectortuts + ": " url ":" http://vector.tutsplus.com/ "," hasPremium ": true," Audiotuts + "url": "http://audio.tutsplus.com/", "hasPremium": true, "Cgtuts +": "url": "http://cg.tutsplus.com/", " : true, "Phototuts +": "url": "http://photo.tutsplus.com/", "hasPremium": true, "Webdesigntuts +": "url": "http: //webdesign.tutsplus .com / "," arePremium ": false," Mobiletuts + ": " url ":" http://mobile.tutsplus.com/ "," arePremium ": false

Fiecare obiect conține două câmpuri: unul cu cheia "Url" a cărui valoare este un șir care conține adresa URL a site-ului și una cu cheia hasPremium a căror valoare este un boolean, care este adevărat dacă site-ul are o secțiune Premium.

Nu suntem limitați să avem exact aceeași structură pentru fiecare obiect din JSON. De exemplu, am putea adăuga o adresă URL suplimentară care să indice URL-ul programului Premium, dar numai pentru acele site-uri care au una:

 "Activetuts +": "url": "http://active.tutsplus.com/", "arePremium": true, "premiumUrl": "http://tutsplus.com/Premium-program/active-Premium/ "," Psdtuts + ": " url ":" http://psd.tutsplus.com/ "," hasPremium ": true," premiumUrl ":" http://tutsplus.com/Premium-program/psd- Premium / "," Nettuts + ": " url ":" http://net.tutsplus.com/ "," arePremium ": true," premiumUrl ":" http://tutsplus.com/Premium-program/ net-Premium / "," Aetuts + ": " url ":" http://ae.tutsplus.com/ "," hasPremium ": true," premiumUrl ": http://tutsplus.com/Premium- program / ae-Premium / "," Vectortuts + ": " url ":" http://vector.tutsplus.com/ "," hasPremium ": true," premiumUrl ":" http://tutsplus.com/ Premium-program / vector-Premium / "," Audiotuts + ": " url ":" http://audio.tutsplus.com/ ", "Premium": true, "premiumUrl": "http: // tutsplus. com / Premium-program / audio-premium / "," Cgtuts + ": " url ":" http://cg.tutsplus.com/ "," hasPremium ": true," premiumUrl " tutsplus.com/Premium-program/cg-Premium/ "," Phototuts + ": " url " : "http://photo.tutsplus.com/", "hasPremium": true, "premiumUrl": "http://tutsplus.com/Premium-program/photo-Premium/", "Webdesigntuts +": url ":" http://webdesign.tutsplus.com/ "," hasPremium ": false," Mobiletuts + ": " url ":" http://mobile.tutsplus.com/ "," hasPremium " 

Am putea include chiar și o gamă de toate cele mai recente tutoriale Premium pentru un anumit site (vă voi arăta Activetuts + aici și limitați-l la câteva premii, pentru a economisi spațiu):

 "Activetuts +": "url": "http://active.tutsplus.com/", "arePremium": true, "premiumUrl": "http://tutsplus.com/Premium-program/active-Premium/ "" previousPremiums ": [" http://tutsplus.com/join/ "," http://active.tutsplus.com/tutorials/games/create-a-space-shooter-game-in-flash-using- as3http: //tutsplus.com/join/ "," http://active.tutsplus.com/tutorials/games/obscuring-and-revealing-scenes-with-as3http://tutsplus.com/join/ "," http://active.tutsplus.com/tutorials/games/building-a-dynamic-shadow-casting-engine-in-as3http://tutsplus.com/join/ "," http://tutsplus.com/join / "], / ** SNIP! ** / "Mobiletuts +": "url": "http://mobile.tutsplus.com/", "arePremium": false

O matrice are sens pentru listarea Premium-urilor, deoarece lucrez sub ipoteza că orice aplicație care citește aceste date va afișa doar o listă de tutoriale Premium, în loc să fie nevoie să le accesezi în funcție de numele lor - așa că nu este necesar să le atribuiți fiecărei chei de șir.

Am putea lua acest lucru și mai mult:

 "Activetuts +": "url": "http://active.tutsplus.com/", "premium": "arePremium": true, "premiumUrl": "http://tutsplus.com/Premium-program / active-Premium / "," previousPremiums ": [" titlul ":" Creați o aplicație personalizată Flash Quiz "," url ":" http://tutsplus.com/join/ ", "Creați un joc Shooter spațial în Flash folosind AS3", "url": "http://active.tutsplus.com/tutorials/games/create-a-space-shooter-game-in-flash-using-as3http:/ /tutsplus.com/join/ ",, " title ":" Observarea și dezvăluirea scenelor cu AS3 "," url ":" http://active.tutsplus.com/tutorials/games/obscuring-and-revealing- scenes-with-as3http: //tutsplus.com/join/ ",, " title ":" Construirea unui motor de casting dinamic în AS3 "," url ":" http://active.tutsplus.com/tutorials /games/building-a-dynamic-shadow-casting-engine-in-as3http://tutsplus.com/join/ ",, " title ":" Animarea podcastului comunitar Envato "," url ":" http : //tutsplus.com/join/ "], / ** SNIP! ** / "Mobiletuts +": "url": "http://mobile.tutsplus.com/", "premium": "arePremium": false

Pfiu! Dacă vrem să putem crea obiecte care să conțină numele și adresele URL ale fiecărui autor al fiecărui tutorial Premium - puteți să găsiți cel mai bun mod de a face acest lucru?

Păstrarea matricelor în mese poate fi utilă; în special pentru jocuri. Acesta ar putea fi aspectul actual al unei placi Tic-Tac-Toe:

 [[1, 2, 0], [0, 1, 0] [0, 2, 1]]

Nu-l vedeți? Încercați să eliminați un spațiu alb:

 [[1,2,0], [0,1,0], [0,2,1]]

1 este nimic, 2 este o cruce și 0 este un spațiu gol. Noughts câștiga! Și sunt sigur că puteți vedea cum ar putea fi folosit ceva asemănător pentru Battleships sau Connect 4 sau Minesweeper. Pentru mai multe informații despre matricele imbricate, consultați tutorialul meu anterior.


Folosind JSON cu diferite platforme

Din moment ce JSON este atât de popular, există Derivatoare (instrumente și biblioteci care decodifică un limbaj de programare astfel încât un altul să o înțeleagă) și generatoare (instrumente și biblioteci care fac opusul, codifică un limbaj de programare în altul) disponibil pentru majoritatea limbajelor de programare. Doar căutați [Parser JSON (numele limbii dvs.]. Voi sublinia câteva dintre ele care sunt relevante pentru cititorii Activetuts +.


Pentru Flash și AS3

Biblioteca standard pentru codarea și decodarea datelor JSON în AS3 este as3corelib; consultați ghidul meu de utilizare a bibliotecilor externe dacă nu sunteți sigur cum să îl instalați.

Puteți decoda un șir formatat în JSON pentru obiecte și arhive AS3 prin trecerea acestuia com.adobe.serialization.json.JSON.decode (); valoarea returnată va fi fie o matrice, fie un obiect, în funcție de JSON. Dacă treceți fals ca un al doilea argument, decodorul nu va respecta standardul JSON atât de strict, încât puteți să vă îndepărtați cu formatul sloppier.

Puteți codifica un obiect sau un matrice AS3 (care poate conține obiecte imbricate și array-uri) într-un șir JSON prin trecerea acestuia com.adobe.serialization.json.JSON.encode (); valoarea retur va fi un String.

Sa anunțat că versiunile viitoare ale Flash vor include parsarea nativă JSON, așa că în curând nu va mai fi nevoie să utilizați as3corelib în acest scop.


Pentru .NET (inclusiv Silverlight)

Pentru a analiza JSON, trebuie doar să adăugați o referință la System.Json. Atunci:

 #using System.Json; decodat = JsonValue.Parse (jsonString); // poate fi un JsonPrimitive, JsonArray sau JsonObject, în funcție de JSON trecut

Pentru a codifica un obiect la un șir JSON este un pic mai complicat. Mai întâi trebuie să creați un contract de date pentru tipul de obiect pe care doriți să îl codificați; să-i sunem pe al nostru Lucru, și obiectul real obiectul meu. Atunci:

 #using System.Runtime.Serialization.Json; MemoryStream myStream = Memorie nouă (); DataContractJsonSerializer jsonEncoder = nou DataContractJsonSerializer (typeof (Thing)); jsonEncoder.WriteObject (myStream, myThing); myStream.Position = 0; StreamReader sr = nou StreamReader (myStream); codificat = sr.ReadToEnd ();

De asemenea, puteți utiliza această metodă pentru a decoda un șir JSON la o anumită clasă de obiect:

 #using System.Runtime.Serialization.Json; myStream.Position = 0; myOtherThing = ser.ReadObject (myStream); // ar trebui să arunci acest lucru ca lucru

Pentru mai multe informații, consultați paginile MSDN Lucrul cu datele JSON și cum să: Serializați și deserializați datele JSON.


Pentru JavaScript (și, prin urmare, aplicații HTML 5)

Tu ar putea doar treceți șirul JSON la eval () în JavaScript, dar acesta este un risc teribil de securitate. Cele mai multe browsere moderne acceptă o funcție JSON.parse (), care va analiza o șir JSON în obiecte JavaScript, și JSON.stringify (), care va transforma un obiect JavaScript într-un șir JSON.

Douglas Crockford a creat o bibliotecă pentru a face acest lucru în browserele mai vechi; este disponibil pe github.


Pentru Unitate

Există un ansamblu C # numit LitJSON pe care îl puteți utiliza în proiectele Unity pentru a analiza și genera JSON. Puteți utiliza acest lucru chiar dacă proiectul dvs. este scris în JavaScript sau Boo mai degrabă decât C #.

Pentru a decoda un obiect Unitate la un șir JSON:

 # folosind LitJson; șirul jsonString = JsonMapper.ToJson (myObject);

Pentru a codifica un șir JSON la un obiect Unity de tipul Thing:

 # folosind LitJson; Thing myThing = JsonMapper.ToObject (JsonString);

Manualul LitJSON este minunat; Vă recomandăm să le citiți pentru mai multe îndrumări.


Pentru alte limbi

JSON.org are o listă lungă de biblioteci pentru diferite platforme și limbi diferite - plus, puteți căuta pe Google, așa cum am menționat mai sus;)

Site-ul are, de asemenea, o serie de vizualizări excelente despre modul în care poate fi construită JSON și o mulțime de detalii care depășesc ceea ce am explicat în această introducere rapidă. Verificați dacă doriți să aflați mai multe!

Cod