Decodare abreviere Json. Ce este JSON? Folosind JSON în Ajax
O lecție care analizează ce este JSON și ce avantaje are față de alte formate de date.
Înțelegerea JSON
JSON (JavaScript Object Notation) este format text reprezentarea datelor în notația obiect JavaScript.
Aceasta înseamnă că datele din JSON sunt organizate în același mod ca într-un obiect JavaScript. Dar spre deosebire de cel mai recent formatÎnregistrările JSON au câteva particularități, care vor fi discutate puțin mai târziu.
JSON este de obicei folosit împreună cu AJAX, astfel încât serverul să poată transmite date într-o formă convenabilă unui script JavaScript, care le va afișa apoi pe pagină.
Structura formatului JSON
Cei care sunt familiarizați cu procesul de creare a obiectelor în JavaScript nu vor vedea nimic nou în structura formatului JSON. Acest lucru se datorează faptului că structura JSON se potrivește cu structura obiectului JavaScript cu unele restricții.
Este mai ușor să te gândești la JSON ca la un container de elemente. Fiecare element dintr-un astfel de container este o unitate structurală constând dintr-o cheie și o valoare.
În acest caz, valoarea este direct legată de cheie și formează așa-numita pereche cheie-valoare. Pentru a obține o valoare într-un astfel de obiect, trebuie să cunoașteți cheia acestuia. Sintactic, astfel de date în JSON sunt scrise după cum urmează:
În intrarea de mai sus, puteți vedea că cheia este separată de valoare cu două puncte (:). În acest caz, cheia din obiectul JSON trebuie să fie inclusă în ghilimele duble. Aceasta este prima caracteristică a JSON care îl deosebește de un obiect JavaScript. pentru că într-un obiect JavaScript, cheia (proprietatea obiectului) nu trebuie să fie cuprinsă între ghilimele duble.
De exemplu, o structură de obiect care este validă din perspectiva JavaScript, dar nu este validă din perspectiva JSON:
Var person = (nume: „John”; ) // obiect JavaScript
Atenție: încercați să setați numele cheii în așa fel încât să nu complice accesul la date, de ex. atunci când compuneți un nume, este de preferat să folosiți notația camel case sau să folosiți un caracter de subliniere ("_") pentru a conecta cuvinte.
Valoarea cheii în JSON poate fi scrisă în unul dintre următoarele formate: șir (șir), număr (număr), obiect (obiect), matrice (matrice), boolean (valoare booleană adevărată sau falsă), nul (valoare specială JavaScript) .
aceasta a doua limitare în JSON, deoarece un obiect JavaScript poate conține orice tip de date, inclusiv o funcție.
Var person = ("nume": "Ioan"; "setName": function() ( console.log(this.name); ) ) // obiect JavaScript
O virgulă (,) este folosită pentru a separa un element (perechea cheie-valoare) de altul.
De exemplu, luați în considerare un JSON format din tipuri variate date.
Atenție: formatul de reprezentare a datelor JSON nu permite utilizarea comentariilor în structura sa.
Lucrul cu JSON în JavaScript
Spre deosebire de un obiect JavaScript, JSON este un șir.
De exemplu:
// de exemplu, variabila personData conține un șir care este JSON var personData = "("name":"Ivan","age":37,"mother":("name":"Olga","age": 58),"copii":["Masha","Igor","Tanya"],"căsătorit": adevărat,"câine": nul)";
Lucrul cu JSON se desfășoară de obicei în două direcții:
- Analiza este traducerea unui șir care conține JSON într-un obiect JavaScript.
- Conversia unui obiect JavaScript într-un șir JSON. Cu alte cuvinte, această acțiune face inversul analizei.
Se analizează JSON
Analiza JSON, de ex. traducerea unui șir JSON într-un obiect JavaScript se face folosind metoda eval() sau parse().
Folosind metoda eval():
// variabila persoană este un obiect JavaScript care se obține prin executarea codului JSON (șir) var person= eval("("+personData+")");
Folosind metoda JSON.parse():
// variabila person este un obiect JavaScript care se obține prin parsarea unui șir JSON var person = JSON.parse(personData);
Conversia unui obiect JavaScript într-un șir JSON
Traducerea unui obiect JavaScript într-un șir JSON se face folosind metoda JSON.stringify(). Această metodă face opusul metodei JSON.parse().
Var personString = JSON.strigify(persoana);
Beneficiile formatului JSON
Formatul de reprezentare a datelor JSON are următoarele avantaje:
- metode convenabile și rapide pentru conversia (parsarea) unui șir JSON într-un obiect JavaScript și invers;
- structură de date clară și simplă;
- dimensiune foarte mică în comparație cu alte formate de date (de ex. XML). Acest lucru se datorează faptului că formatul JSON conține formatarea minimă posibilă, de exemplu. la scrierea lui se folosesc doar câteva caractere speciale. Acesta este un avantaj foarte important, deoarece datele prezentate în format JSON se vor încărca mai repede decât dacă ar fi prezentate în alte formate.
Datorită faptului că acest format are o mulțime de avantaje, a devenit folosit nu numai în JavaScript, ci și în multe alte limbi, precum C, Ruby, Perl, Python, PHP etc.
Comparație între formatele JSON și XML
Formatul JSON are următoarele avantaje față de formatul XML:
- La transmiterea unor date, dimensiunea JSON va fi semnificativ mai mică decât dimensiunea XML.
- JSON are metode mai convenabile pentru conversia în structuri Date JavaScript decât XML.
- JSON este mai ușor de creat decât XML.
Lucrul cu date JSON după parsare se face ca și cu un obiect JavaScript.
//JSON var personData = "("nume":"Ivan","varsta":37,"mama":("nume":"Olga","varsta":58),"copii":["Masha" ,"Igor","Tanya"],"căsătorit": adevărat,"câine": nul)"; //JavaScript person object var person = JSON.parse(personData);
Luați în considerare punctele principale:
//obține valorile cheii (proprietății) nume person.name; persoană[„nume”]; //obține valorile numelui cheii (proprietății), aflate în obiectul mamă persoană.mamă.nume; //șterge elementul de vârstă șterge(persoană.vârstă) //adaugă (sau actualizează) cheie (proprietate) person.eye = "maro"; //când lucrați cu matrice, trebuie să utilizați metode concepute pentru a funcționa în mod specific cu matrice //eliminați 1 element din matrice (metoda splice) person.children.splice(1,1) //adăugați un element în matrice (metoda push ) persoană.copii.împinge(„Kate”);
Pentru a itera elementele dintr-un obiect, puteți utiliza o buclă for..in:
Pentru (cheie în persoană) ( dacă (person.hasOwnProperty(cheie)) ( //cheie = cheie //valoare = persoană console.log("Cheie = " + cheie); console.log("Valoare = " + persoană) ; ) // dacă obiectul persoană are o cheie (dacă persoana are o proprietate cheie) ) // repetă peste toate cheile (proprietățile) din obiect
Puteți utiliza următoarea buclă pentru a itera elementele unui tablou:
Pentru (var i=0; i
), și între serverele în sine (interfețe HTTP programatice). Formatul JSON este, de asemenea, potrivit pentru stocarea structurilor dinamice complexe în baze de date relaționale sau cache de fișiere.
Deoarece formatul JSON este un subset al sintaxei limbajului JavaScript, acesta poate fi deserializat rapid cu funcția încorporată eval(). În plus, este posibil să inserați funcții JavaScript complet funcționale. În PHP, începând cu versiunea 5.2.0, suportul JSON a fost inclus în nucleu sub forma funcțiilor json_decode() și json_encode(), care convertesc ele însele tipurile de date JSON în tipurile PHP corespunzătoare și invers.
Sintaxă
JSON este construit pe două structuri:
- Un set de perechi cheie/valoare. În diferite limbi, acest lucru este implementat ca un obiect, înregistrare , structură , dicționar , tabel hash , listă cu chei sau matrice asociativă . Cheia poate fi doar un șir, valoarea poate fi orice formă.
- Un set numerotat de valori. În multe limbi, acest lucru este implementat ca matrice, vector , listă sau secvență .
Acestea sunt structuri de date generice. Teoretic, toate limbajele de programare moderne le susțin într-o formă sau alta. Deoarece JSON este folosit pentru schimb de dateîntre diferite limbaje de programare, este logic să o construim pe aceste structuri.
În JSON, sunt utilizate următoarele forme:
- Un obiect este un set neordonat de perechi nume/valoare cuprinse între acolade ( ). Există un simbol între nume și valoare ": " , iar perechile nume/valoare sunt separate prin virgule.
- matrice(unidimensional) este un set de valori care au numere ordinale (indici). Matricea este cuprinsă între paranteze drepte. Valorile sunt separate prin virgule.
- Sens poate şirîntre ghilimele duble, număr, sens Adevărat sau fals, obiect, matrice, sau valoarea nul. Aceste structuri pot fi imbricate unele în altele.
- Linia este un set ordonat de zero sau mai multe caractere unicode, cuprinse între ghilimele duble, folosind secvențe de escape care încep cu o bară oblică inversă. Caracterele sunt reprezentate printr-un șir simplu.
- Nume este o sfoară.
Linia foarte asemănător cu șir în limbi și Java. Număr este, de asemenea, foarte asemănător cu un număr C sau Java, cu excepția faptului că este folosit doar formatul zecimal. Pot fi introduse spații între oricare două caractere.
Următorul exemplu arată o reprezentare JSON a unui obiect care descrie o persoană. Obiectul are şir câmpuri pentru nume și prenume, un obiect care descrie o adresă și o matrice care conține o listă de numere de telefon.
( „firstName” : „Ivan” , „lastName” : „Ivanov” , „adresă” : ( „streetAddress” : „Autostrada Moscova, 101, ap. 101”, „oraș” : „Leningrad” , „cod postal” : 101101 ), „numere de telefon” : [ „812 123-1234” , „916 123-4567” ] )
În XML, o astfel de structură ar arăta cam așa:
Comparație cu YAML
Atât din punct de vedere funcțional, cât și din punct de vedere sintactic, JSON este un subset al limbajului YAML. În special, specificația YAML 1.2 afirmă că „orice fișier JSON este un fișier YAML valid”. Cel mai comun parser YAML este capabil să gestioneze și JSON. Specificația YAML anterioară 1.2 nu acoperea complet JSON, în primul rând din cauza lipsei suportului nativ UTF-32 în YAML, precum și a cerinței de spațiu după delimitatorul virgulă. În plus, specificația JSON a inclus comentarii de stil /* */.
Cea mai importantă diferență dintre YAML este un set de extensii de sintaxă care nu au echivalent în JSON:
Relațional: YAML acceptă date relaționale: într-un document YAML, puteți face referire la o ancoră întâlnită mai devreme în fișier/flux. În acest fel, pot fi exprimate structuri recursive. Extensibil: YAML acceptă tipuri de date extensibile în afară de primitive (adică șiruri, numere, boolean). Blocuri: Sintaxa blocurilor indentate este disponibilă în YAML; vă permite să descrieți date structurate fără a utiliza caractere suplimentare (toate tipurile de paranteze, ghilimele etc.).
schema json
Schema JSON este unul dintre limbile pentru descrierea structurii unui document JSON. Utilizează sintaxa JSON. Bazat pe conceptele XML Schema, RelaxNG, Kwalify. Schema JSON este un limbaj de auto-descriere: atunci când este utilizat pentru a procesa date și a descrie valabilitatea acestora, pot fi utilizate aceleași instrumente de serializare/deserializare.
Folosind JSON în Ajax
Următorul exemplu de cod Javascript arată cum un browser poate folosi XMLHttpRequest pentru a solicita un obiect JSON de la server (partea server a programului este omisă; ar trebui să conțină codul care trimite date în formatul șirului JSON ca răspuns la solicitările URL).
Var the_obiectul; var http_request = new XMLHttpRequest() ; http_request.open( „GET” , url, adevărat ); http_request.send(null) ; http_request.onreadystatechange = function () ( if ( http_request.readyState == 4 ) ( if ( http_request.status == 200 ) ( the_object = JSON.parse (http_request.responseText ) ; ) else ( alert( „A apărut o problemă cu adresa URL”.) ; ) http_request = null ; ) ) ;
observa asta exemplu dat Utilizarea XMLHttpRequest nu este universală pentru toate browserele (pentru browserele bazate pe Internet Explorer , Opera , Safari și Mozilla , ar trebui să existe unele diferențe în cod). Posibilitățile de utilizare a XMLHttpRequest sunt limitate din cauza aceleiași politici de origine: URL-ul de răspuns pentru cerere trebuie să fie în același domeniu DNS cu serverul care găzduiește pagina care solicită răspunsul. Alternativ, este utilizată o abordare JSONP, care implică utilizarea unui apel de funcție codificat transmis între client și server, astfel încât clientul să poată descărca date codificate JSON de pe domenii terțe și să notifice apelantul de finalizare, deși acest lucru introduce unele riscuri de securitate și cerințe suplimentare de server.
Alternativ, în codul paginii, puteți utiliza elemente
De asemenea, puteți utiliza aceeași politică de origine pentru a transmite date JSON folosind etichete dinamice, dar acest lucru duce la cod vulnerabil. JSONRequest a fost sugerat ca o alternativă mai sigură.
Intrebari de securitate
Deși JSON este menit să fie serializat, sintaxa sa este similară cu JavaScript și acest lucru creează o serie de probleme de securitate. Adesea, datele primite de la o sursă externă în format JSON sunt procesate de funcția eval() fără nicio validare preliminară.
Evaluare JavaScript()
Deoarece JSON pare a fi corect din punct de vedere sintactic Cod JavaScript, cel mai simplu mod de a analiza datele JSON într-un program JavaScript este să utilizați programul încorporat Funcții JavaScript eval() , care este pentru a executa expresii JavaScript. Cu această abordare, nu este nevoie să folosiți analizatori suplimentari.
Tehnica eval() face sistemul vulnerabil dacă sursa datelor JSON utilizate nu este de încredere ( Engleză). Astfel de date pot fi cod JavaScript rău intenționat pentru atacurile clasei Code Injection ( Engleză). Folosind această vulnerabilitate, este posibil să se efectueze furt de date, falsificare de autentificare. Cu toate acestea, vulnerabilitatea poate fi eliminată prin utilizarea unor instrumente suplimentare de validare a datelor pentru corectitudine. De exemplu, înainte ca eval() să fie executat, datele primite de la o sursă externă pot fi validate folosind expresii regulate. RFC care definește JSON sugerează utilizarea următorului cod pentru a verifica dacă este conform cu formatul JSON
Var my_JSON_object = ! ( /[^,:()\[\]0-9.\-+Eaeflnr-u \n\r\t]/.test ( text.replace (/"(\\.|[^"\\])*"/g , "" ) ) ) && eval("(" + text + ")" ) ;
Cum a fost sugerată o alternativă mai sigură la eval(). optiune noua parseJSON() care poate analiza numai date JSON. A fost introdus în a patra versiune a standardului ECMAScript și descris în articolul „JSON: O alternativă fără grăsimi la XML”. În prezent este disponibilă ca bibliotecă JavaScript și va fi inclusă în cea de-a cincea ediție a ECMAScript.
JSON încorporat
Versiunile recente ale browserelor web au suport încorporat pentru JSON și sunt capabile să-l proceseze fără a apela funcția eval(), ceea ce duce la problema descrisă. Procesarea JSON în acest caz este de obicei mai rapidă. Deci, în iunie 2009, următoarele browsere aveau suport nativ JSON:
Cel puțin cinci biblioteci JavaScript populare folosesc JSON inline atunci când sunt disponibile:
Falsificarea cererii pe mai multe domenii
Utilizarea prost concepută a JSON face site-urile vulnerabile la falsificarea cererilor între site-uri (CSRF sau XSRF). Pentru că eticheta pentru a accesa alte servere decât serverul de pe care a fost încărcată pagina.
Fără a utiliza tehnologia JSONP (adică folosind doar codificarea datelor JSON), serverul poate returna doar date. De exemplu astfel:
( „hârtie” : „A4” , „număr” : 5 )
Cu toate acestea, acestea sunt doar date și nu pot afecta browserul.
Folosind tehnica JSONP, numele funcției de apel invers este transmis serverului terță parte în șirul de apeluri (GET):
Aici parametrul jsonp conține numele de apel invers al funcției parseResponse.
Acum, serverul străin example.com poate returna următorul cod:
ParseResponse(( „hârtie” : „A4” , „număr” : 5 ) )
Acum codul apelează funcția javascript a primului domeniu.
Ideea a fost propusă inițial pe blogul MacPython în 2005 și este utilizată în prezent de multe aplicații Web 2.0, cum ar fi Dojo Toolkit Applications, Google Toolkit Applications și zanox Web Services. Au fost propuse extensii suplimentare ale acestui protocol pentru a permite argumente suplimentare, cum ar fi în cazul JSONPP susținut de serviciile web S3DB.
Deoarece JSONP utilizează etichete de script, apelurile sunt în esență deschise lumii. Din acest motiv, este posibil ca JSONP să nu fie adecvat pentru stocarea datelor sensibile.
Includerea etichetelor de script de pe site-uri la distanță le permite să transmită orice conținut de pe site. Dacă site-ul la distanță are vulnerabilități care permit injectarea Javascript, atunci site-ul original poate fi și el afectat.
JSONPP(JSON parametrizat cu padding) JSON parametrizat cu padding - o evoluție a ideii JSONP
JSONPP include adresa URL a sursei, numele funcției care va procesa datele JSON, șirul de evalat după ce datele sunt primite și șirul de evalat când datele sunt terminate:
JSON_call(SRC, JSONP, JSONPP, ONLOAD) ;
în cele din urmă se întoarce
Răspuns = JSONP(SRC) ( eval(JSONPP(ans) ) ; eval(ONLOAD) ; )
În general, numărul de parametri nu este important pentru ideea JSONPP în sine. SRC, JSONP, JSONPP (și procesarea lor pe partea serverului și apoi pe partea clientului) este suficient pentru ca acesta să fie JSONPP.
Luați în considerare exemplul de lucru cu serviciul S3DB.
Funcția s3db_jsonpp_call(src, next_eval) ( var call = "call_" + Math .random () .toString () .replace (/\./g , "" ) ; var headID = document.getElementsByTagName ("head") [ 0 ] ;var script = document.createElement("script" ) ;script.id = call;script.type = "text/javascript" ; // folosind json căptușit, parametrizat src=src+ „&format=json&jsonp=s3db_jsonpp&jsonpp="+next_eval+ „&onload=remove_element_by_id(””+ script.id + "")" ; script.src = src; headID.appendChild (script) ; // preluați răspunsul ) funcție s3db_jsonpp(ans, jsonpp) ( eval(jsonpp) ; return ans; ) funcție remove_element_by_id(id) ( var e = document.getElementById (id) ; e.parentNode .removeChild (e) ; return false ; )
În exemplu, funcția s3db_jsonpp_call() creează un element de script în partea de cap a DOM al cărui src se potrivește cu apelul JSONPP.
După primirea unui răspuns de la server, s3db_jsonpp() va fi apelat - este transmis în parametrii de apel, așa cum ar trebui să fie conform regulilor JSONP.
În interiorul s3db_jsonpp(), eval(jsonpp) va funcționa și ans va fi returnat.
Apelarea eval(onload) face ca remove_element_by_id() să fie executat cu id-ul scriptului creat în cap și, ca urmare, la eliminarea acestuia, deoarece oricum nu va mai fi folosit, deoarece id-ul din exemplu a fost generat aleatoriu chiar la începutul funcției s3db_jsonpp_call(). Acest apel este în răspunsul serverului.
Referiri la obiecte
Standardul JSON nu acceptă referințe la obiecte, cu toate acestea, setul de instrumente Dojo demonstrează modul în care JSON standard poate suporta astfel de referințe cu convenții suplimentare. În special, modulul dojox.json.ref oferă suport pentru mai multe forme de linkuri, inclusiv linkuri circulare, multiple, interdocument și leneșe.
Vezi si
Note
- YAML Ain't Markup Language (YAML™) Versiunea 1.2. - Proiect de lucru 2008-05-11. (link indisponibil - poveste) Preluat la 24 septembrie 2009.
- . RedHanded (07 aprilie 2005). Preluat la 25 septembrie 2012..
- json.com Propunere de schemă JSON. (link indisponibil - poveste)
- RFC 4627
- JSON: O alternativă fără grăsimi la XML. arhivat
- json2.js . Arhivat din original pe 12 februarie 2012. Consultat la 24 septembrie 2009.
- Folosind JSON inline.
- JSON încorporat în IE8. Arhivat din original pe 12 februarie 2012.
- Specificații web acceptate în Opera Presto 2.5 (10 martie 2010). Arhivat din original pe 12 februarie 2012. Consultat la 29 martie 2010.
- ES 3.1 Implementarea obiectului JSON.
- Biletul #4429lang=ro . Arhivat din original pe 12 februarie 2012.
- Biletul #4429 (22 mai 2009). Arhivat din original pe 12 februarie 2012. Consultat la 3 iulie 2009.
- Biletul #8111lang=ro . Arhivat din original pe 12 februarie 2012.
- MooTools Core & More 1.3.1. Arhivat din original pe 12 februarie 2012.
- YUI 2: utilitar JSON (1 septembrie 2009). Arhivat din original pe 12 februarie 2012. Consultat la 22 octombrie 2009.
- Aflați JSON (7 aprilie 2010). Arhivat din original pe 12 februarie 2012. Consultat la 7 aprilie 2010.
- Jeremy Grossman Tehnici avansate de atac pentru aplicațiile web care utilizează Gmail. securitate cu pălărie albă. Arhivat din original pe 12 februarie 2012. Consultat la 23 septembrie 2009.
- din __future__ import * » Remote JSON - JSONP . Bob.pythonmac.org. Arhivat din original pe 12 februarie 2012. Consultat la 8 septembrie 2008.
- Almeida, Jonas (11 iunie 2008). JSON, JSONP, JSONPP? » (S3DB). Consultat 2009-04-26.
- RIAspot JSON P pentru Cross Site XHR . (link indisponibil - poveste)
- Referințe JSON în Dojo. Arhivat din original pe 12 februarie 2012.
Legături
- Pagina de pornire oficială a formatului în limba rusă
- json.js , json2.js este o bibliotecă dezvoltată de Douglas Crockford pentru a lucra cu date JSON în JavaScript. Extinde un obiect cu o metodă toJSONString, care este apoi prezentă în orice obiect și îl convertește într-un șir JSON.
- json-rpc.org
Limbaje de marcare a documentelor | |
---|---|
documente de birou | Format de document compus OOXML (SpreadsheetML, PresentationML, WordprocessingML) |
Trebuie să fi auzit de JSON înainte. Ce este? Ce poate face și cum poate fi folosit?
În această lecție, vom acoperi elementele de bază ale JSON și vom acoperi următoarele puncte:
- Ce este JSON?
- Pentru ce este folosit JSON?
- Cum se creează un șir JSON?
- Un exemplu simplu de șir JSON.
- Să comparăm JSON și XML.
- Cum se lucrează cu JSON în JavaScript și PHP?
Ce este JSON?
JSON este o modalitate simplă, bazată pe text, de a stoca și comunica date structurate. Cu o sintaxă simplă, puteți stoca cu ușurință orice, de la un singur număr la șiruri de caractere, matrice și obiecte în text simplu. De asemenea, puteți lega matrice și obiecte împreună pentru a crea structuri complexe de date.
Odată ce un șir JSON a fost creat, este ușor să îl trimiteți către o altă aplicație sau către o altă locație din rețea, deoarece este text simplu.
JSON are următoarele beneficii:
- Este compact.
- Propozițiile sale sunt ușor de citit și compus atât de om, cât și de computer.
- Poate fi convertit cu ușurință într-o structură de date pentru majoritatea limbajelor de programare (numere, șiruri, booleeni, matrice și așa mai departe)
- Multe limbaje de programare au funcții și biblioteci pentru citirea și crearea structurilor JSON.
Numele JSON înseamnă JavaScript Object Notation (reprezentarea obiectelor JavaScript). După cum reprezintă numele, se bazează pe modul în care sunt definite obiectele (foarte similar cu crearea de tablouri asociative în alte limbi) și tablouri.
Pentru ce este folosit JSON?
Cea mai obișnuită utilizare a JSON este trimiterea datelor de la server la browser. De obicei, datele JSON sunt livrate folosind AJAX, care permite browserului și serverului să facă schimb de date fără a fi nevoie să reîncarce pagina.
- Utilizatorul face clic pe o miniatură a unui produs dintr-un magazin online.
- JavaScript care rulează pe browser face o solicitare AJAX către script-ul PHP care rulează pe server, pasând ID-ul produsului selectat.
- Scriptul PHP primește numele produsului, descrierea, prețul și alte informații din baza de date. Apoi compune un șir JSON din date și îl trimite în browser.
- JavaScript care rulează în browser primește șirul JSON, îl decodifică și afișează informațiile despre produs pe pagină pentru utilizator.
De asemenea, puteți utiliza JSON pentru a trimite date din browser către server, trecând șirul JSON ca parametru în solicitările GET sau POST. Dar aceasta metoda este mai puțin obișnuită, deoarece trecerea datelor prin solicitările AJAX poate fi simplificată. De exemplu, ID-ul produsului poate fi inclus în adresa URL ca parte a unei cereri GET.
Biblioteca jQuery are mai multe metode, cum ar fi getJSON() și parseJSON() , care facilitează recuperarea datelor folosind JSON prin solicitări AJAX.
Cum se creează un șir JSON?
Există câteva reguli de bază pentru crearea unui șir JSON:
- Șirul JSON conține fie o matrice de valori, fie un obiect (o matrice asociativă de perechi nume/valoare).
- matrice este cuprins între paranteze drepte ([ și ]) și conține o listă de valori separate prin virgulă.
- Un obiect este cuprins între acolade (( și )) și conține o listă de perechi nume/valoare, separate prin virgulă.
- pereche nume/valoare constă din numele câmpului cuprins între ghilimele duble, urmat de două puncte (:) și valoarea câmpului.
- Sensîntr-o matrice sau obiect poate fi:
- Număr (întreg sau virgulă mobilă)
- Șir (între ghilimele duble)
- Valoare booleană (adevărat sau fals)
- O altă matrice (închisă între paranteze drepte)
- Un alt obiect (închis între acolade)
- valoare nulă
Pentru a include ghilimele duble într-un șir, trebuie să utilizați o bară oblică inversă: \" . La fel ca în multe limbaje de programare, puteți pune caractere de control și coduri hexadecimale într-un șir prefixându-le cu o bară oblică inversă. Pentru detalii, consultați site-ul JSON.
Exemplu simplu de șir JSON
Următorul este un exemplu de plată în format JSON:
( „comanda comandă”: 12345, „nume cumpărător”: „Vanya Ivanov”, „e-mail cumpărător”: „ivanov@example.com”, „conținut”: [ ( „codprodus”: 34, „numeprodus”: „Super produs”, „ cantitate": 1 ), ( "codprodus": 56, "numeprodus": "Produs miraculos", "cantitate": 3 ) ], "comandaCompleted": adevărat )
Să ne uităm la linie în detaliu:
- Creăm un obiect folosind acolade (( și )).
- Obiectul are mai multe perechi nume/valoare: „orderID”: 12345 Proprietate numită „orderId” și valoare întreagă 12345 „shopperName”: proprietate „Vanya Ivanov” numită „shopperName” și valoarea șirului „Vanya Ivanov” „shopperEmail”: „ johnsmith@ example.com" Proprietate numită „shopperEmail” cu valoarea șirului „ivanov@example.com” „conținut”: [ ... ] Proprietate numită „conținut” a cărei valoare este o matrice „orderCompleted”: true Proprietate numită „orderCompleted” și boolean Adevărat
- Există 2 obiecte în matricea „conținut” reprezentând elementele rând din ordine. Fiecare obiect conține 3 proprietăți: productID , productName și cantitate .
Apropo, deoarece JSON se bazează pe declararea obiectelor JavaScript, puteți face rapid și ușor șirul JSON de mai sus un obiect JavaScript:
Compararea JSON și XML
În multe feluri, puteți considera JSON ca o alternativă la XML, cel puțin în domeniul aplicațiilor web. Conceptul de AJAX sa bazat inițial pe utilizarea XML pentru a transfera date între un server și un browser. Dar în ultimii ani, JSON a devenit din ce în ce mai popular pentru transferul de date AJAX.
În timp ce XML este o tehnologie dovedită care a fost folosită într-un număr destul de mare de aplicații, JSON are avantajul de a fi un format de date mai compact și mai ușor de recunoscut.
Iată cum ar arăta exemplul de obiect XML de mai sus:
Versiunea XML este substanțial mai mare. Are de fapt 1128 de caractere, în timp ce varianta JSON are doar 323 de caractere. Versiunea XML este, de asemenea, greu de înțeles.
Desigur, acesta este un exemplu radical. Și este posibil să creați o intrare XML mai compactă. Dar chiar și va fi semnificativ mai lung decât echivalentul JSON.
Lucrul cu șirul JSON în JavaScript
JSON are un format simplu, dar crearea manuală a unui șir JSON este destul de obositoare. În plus, adesea trebuie să luați un șir JSON, să convertiți conținutul acestuia într-o variabilă care poate fi folosită în cod.
Majoritatea limbajelor de programare au instrumente pentru a converti cu ușurință variabilele în șiruri JSON și invers.
Creați un șir JSON dintr-o variabilă
JavaScript are încorporată o metodă JSON.stringify() care preia o variabilă și returnează un șir JSON reprezentând conținutul acesteia. De exemplu, să creăm un obiect JavaScript care conține detaliile comenzii din exemplul nostru și apoi să creăm un șir JSON din acesta:
Acest cod va da:
Rețineți că metoda JSON.stringify() returnează un șir JSON fără spații. Este mai greu de citit, dar este mai compact pentru transmisie printr-o rețea.
Există mai multe moduri de a analiza un șir JSON în JavaScript, dar cea mai sigură și cea mai de încredere este să utilizați metoda încorporată JSON.parse(). Este nevoie de un șir JSON și returnează un obiect sau o matrice JavaScript care conține datele. De exemplu:
Am creat o variabilă jsonString care conține șirul JSON al exemplului nostru de comandă. Apoi trecem acest șir la metoda JSON.parse(), care creează un obiect care conține datele JSON și îl stochează în variabila cart. Tot ce rămâne de făcut este să testeze prin tipărirea proprietăților obiectului shopperEmail și productName al matricei de conținut.
Ca rezultat, vom obține următorul rezultat:
Într-o aplicație reală, codul JavaScript va primi comanda ca șir JSON într-un răspuns AJAX de la scriptul serverului, va trece șirul la metoda JSON.parse() și apoi va folosi datele pentru a le afișa pe pagina utilizatorului.
JSON.stringify() și JSON.parse() au alte posibilități, cum ar fi utilizarea funcțiilor de apel invers pentru a converti anumite date personalizate. Aceste opțiuni sunt foarte utile pentru a converti diferite date în obiecte JavaScript valide.
Lucrul cu șirul JSON în PHP
PHP, ca și JavaScript, are funcții încorporate pentru lucrul cu șiruri JSON.
Creați un șir JSON dintr-o variabilă PHP
Funcția json_encode() acceptă variabilă PHPși returnează un șir JSON reprezentând conținutul variabilei. Iată exemplul nostru de comandă scris în PHP:
12345, "shopperName" => "Vanya Ivanov", "shopperEmail" => "ivanov@example.com", "contents" => array(array("productID" => 34, "productName" => "Super produs" , "cantity" => 1), array("productID" => 56, "productName" => "Wonder Product", "quantity" => 3)), "orderCompleted" => true); echo json_encode($cart); ?>
Acest cod returnează exact același șir JSON ca în exemplul JavaScript:
("orderID":12345,"shopperName":"Vanya Ivanov","shopperEmail":"ivanov@example.com","contents":[("productID":34,"productName":"Super produs"," cantitate":1),("productID":56,"productName":"Wonder Product","cantity":3)],"orderCompleted":true)
Într-o aplicație reală, scriptul dvs. PHP va trimite linie dată JSON ca parte a răspunsului AJAX la browser, unde codul JavaScript folosește metoda JSON.parse() pentru a-l converti înapoi într-o variabilă pentru afișare pe pagina utilizatorului.
Puteți trece diferite steaguri ca al doilea argument funcției json_encode(). Cu ajutorul lor, puteți schimba principiile de codificare a conținutului variabilelor într-un șir JSON.
Creați o variabilă dintr-un șir JSON
Metoda json_decode() este folosită pentru a converti un șir JSON într-o variabilă PHP. Să înlocuim exemplul nostru JavaScript cu metoda JSON.parse() cu cod PHP:
e-mailul cumpărătorului. "
"; echo $cart->contents->productName . "
";
?>
În ceea ce privește JavaScript, acest cod va produce:
Ivanov@example.com Produs minunat
În mod implicit, funcția json_decode() returnează obiecte JSON ca obiecte PHP. Există obiecte PHP generice din clasa stdClass. De aceea folosim -> pentru a accesa proprietățile obiectului din exemplul de mai sus.
Dacă aveți nevoie de un obiect JSON sub forma unui tablou PHP asociat, trebuie să treceți true ca al doilea argument funcției json_decode(). De exemplu:
$cart = json_decode($jsonString, adevărat); echo $cart["shopperEmail"] . "
"; echo $cart["conținut"]["productName"] . "
";
Acest cod va produce aceeași ieșire:
Ivanov@example.com Produs minunat
De asemenea, puteți transmite alte argumente funcției json_decode() pentru a specifica profunzimea recursiunii și cât de mari sunt gestionate numerele întregi.
Concluzie
Deși JSON este ușor de înțeles și de utilizat, este un instrument foarte util și flexibil pentru transmiterea datelor între aplicații și computere, mai ales când se utilizează AJAX. Dacă intenționați să dezvoltați o aplicație AJAX, atunci nu există nicio îndoială că JSON va fi cel mai important instrument din atelierul dvs.
Constând din perechi atribut-valoare. Acesta este cel mai comun format de date folosit pentru comunicarea asincronă între browser și server, înlocuind în mare măsură XML (folosind AJAX).
JSON este un format de date independent de limbaj care a fost derivat din JavaScript. Începând cu 2017, multe limbaje de programare folosesc cod pentru a genera și analiza date numai în acesta. Numele fișierelor JSON folosesc extensia .json.
Istoria creației
Formatul JSON a fost dezvoltat inițial de Douglas Crockford la începutul anilor 2000, iar ulterior două standarde concurente (RFC 7159 și ECMA-404) l-au definit în 2013. Standardul ECMA descrie doar sintaxa validă, în timp ce RFC acoperă unele elemente de bază de securitate și interoperabilitate.
În plus, există RFC 7493, care definește un profil restricționat cunoscut sub numele de I-JSON (prescurtare pentru „Internet JSON”). Acesta încearcă să depășească unele probleme de interoperabilitate. Fiecare astfel de document este un document JSON valid.
Necesitatea creării acestui format a luat naștere din necesitatea unui protocol de comunicare real între server și browser, realizat în timp real fără utilizarea de plug-in-uri (cum ar fi applet-urile Flash sau Java).
Dezvoltare și aplicare
După cum sa menționat deja, Douglas Crockford, în calitate de fondator al StateSoftware, a identificat și popularizat mai întâi formatul JSON. Ulterior, co-fondatorii au convenit să creeze un sistem folosind specificații standard browser și a oferit un strat de abstractizare pentru ca dezvoltatorii să creeze aplicații cu o conexiune duplex continuă la un server web. În același timp, a devenit posibilă menținerea a două conexiuni HTTP deschise și procesarea lor până la timpul de lucru standard al browserului dacă nu se face schimb de date. Co-fondatorii au ținut o discuție la masă rotundă și au votat pentru denumirea formatului de date JSML sau JSON, precum și pentru a determina tipul de licență sub care va fi disponibilă noua dezvoltare. Formatul este în prezent open source.
Uz practic
Site-ul web JSON.org a fost lansat în 2002. În decembrie 2005, Yahoo! a început să ofere unele dintre serviciile sale web în acest format. Google a început să folosească feeduri JSON pentru protocolul său web GData abia în decembrie 2006.
Formatul de fișier JSON a fost inițial destinat și utilizat în mod obișnuit împreună cu un subset al limbajului de scripting JavaScript (în special, Standardul ECMA-262 ediția a treia-decembrie). Cu toate acestea, acesta este un format independent de limbă. Codul pentru analizarea și generarea datelor JSON este disponibil în multe limbaje de programare. Site-ul web JSON listează toate bibliotecile.
Deși formatul JSON online a fost anunțat inițial ca fiind un subset strict de JavaScript și ECMAScript, ocazional permite ca unele caractere să nu scape în șiruri care sunt ilegale în șiruri JavaScriptși ECMAScript.
JSON însuși a devenit un standard internațional ECMA în 2013 ca standard ECMA-404, care a fost folosit ca referință în RFC 7158 în același an. În 2014, RFC 7159 a devenit principala referință pentru utilizarea JSON pe web (de exemplu, aplicația MIME/json).
Tipuri de date, sintaxă și exemplu
Principalele tipuri de date JSON sunt:
- Număr: un număr zecimal cu semn care poate conține o parte fracțională și poate folosi notația E exponențială, dar nu poate include non-numere (cum ar fi NaN). Formatul nu face distincție între numere întregi și numere în virgulă mobilă. JavaScript folosește formatul în virgulă mobilă cu precizie dublă pentru toate valorile sale numerice, dar alte limbaje care implementează JSON le pot codifica diferit.
- Șir: o secvență de caractere Unicode zero sau mai mari. Șirurile sunt delimitate de ghilimele duble și acceptă sintaxa backslash.
- Literale: oricare dintre valorile adevărate sau false.
- Matrice: o listă ordonată de zero sau mai multe valori, fiecare dintre acestea putând fi de orice tip. Matricele folosesc paranteze drepte cu virgule.
- Obiect: O colecție neordonată de perechi nume/valoare în care numele (numite și chei) sunt șiruri. Deoarece obiectele sunt destinate să reprezinte tablouri asociative, se recomandă (deși nu este necesar) ca fiecare cheie să fie unică în ea. Obiectele sunt separate prin acolade și folosesc virgule pentru a separa fiecare pereche, în timp ce în fiecare pereche un caracter două puncte separă cheia sau numele de valoarea sa.
- Null: O valoare goală folosind cuvântul nul.
Spațiile delimitate sunt permise și pot fi plasate în jurul sau între elementele de sintaxă (semnificații și punctuații, dar nu în cadrul unei valori de șir). În acest scop, doar patru caracter special sunt considerate spații: spațiu, tab orizontal, linie nouă și bară oblică. În special, marca de ordine a octeților nu trebuie să fie generată de implementarea conformă (deși poate fi acceptată la analizarea JSON). Solicitarea JSON nu oferă sintaxă pentru comentarii.
Versiunile timpurii (cum ar fi cele specificate în RFC 4627) necesitau ca un document valid să fie format numai dintr-un tip de obiect sau de matrice, care ar putea conține alte tipuri în interiorul lor. Acest format JSON, al cărui exemplu poate fi găsit pe paginile web vechi, nu este utilizat în prezent.
Probleme legate de portabilitatea datelor
Chiar dacă Douglas Crockford a declarat inițial că JSON este un subset strict al JavaScript, specificațiile sale permit de fapt să fie create documente care nu pot fi citite în JavaScript. În special, JSON permite ca valorile șirurilor Unicode U+2028 LINE SEPARATOR și U+2029 PARAGRAPH SEPARATOR să apară fără escape în șiruri ghilimele, în timp ce JavaScript nu. Aceasta este o consecință a faptului că JSON interzice doar „caracterele de control”. Pentru o compatibilitate maximă, aceste caractere trebuie să fie eliminate cu o bară oblică inversă. Această subtilitate este importantă atunci când creați JSONP.
Format JSON: cum se deschide?
Documentele JSON pot fi codificate în UTF-8, UTF-16 sau UTF-32, codificarea implicită este UTF-8. Aceste standarde susțin Set complet Caractere „Unicode”, inclusiv caractere din afara planului multilingv de bază (U+10000 până la U+10FFFF). Cu toate acestea, dacă se scapă, aceste caractere trebuie scrise folosind perechi surogat UTF-16, un detaliu ratat de unii analizatori ai formatului JSON. Cum se deschide și cum va fi citit un astfel de fișier?
Numerele în acest format sunt agnostici cu privire la reprezentarea lor în limbaje de programare. Nu există nicio distincție între un număr întreg și o valoare în virgulă mobilă: unele implementări pot trata 42, 42.0 și 4.2E + 1 ca fiind același număr, în timp ce altele nu. În plus, nu există cerințe referitoare la probleme precum depășirea, depășirea, pierderea preciziei sau rotunjirea. De asemenea, formatul JSON nu spune nimic despre gestionarea zerourilor semnate, indiferent dacă 0.0 este sau nu diferit de -0.0. Majoritatea implementărilor care utilizează standardul IEEE 754 în virgulă mobilă, inclusiv JavaScript, păstrează zerourile semnate, dar nu toate implementările JSON pot.
Utilizare în JavaScript
Deoarece formatul JSON a fost derivat din JavaScript și sintaxa sa este (în mare parte) un subset al limbajului, funcția JavaScripteval poate fi utilizată pentru a analiza datele JSON. Din cauza problemei cu analizarea terminatoarelor de șir Unicode discutate în secțiunea anterioară, funcția eval trebuie să le înlocuiască.
Acest lucru nu este sigur dacă șirul nu este validat corespunzător. În schimb, ar trebui să utilizați biblioteca de analiză JSON sau suportul său JavaScript pentru a citi și scrie JSON.
Un parser implementat corect acceptă doar un format JSON valid a cărui descriere este prezentă în sistem, prevenind potențial execuția neintenționată cod rău intenționat.
Din 2010, în browsere web precum Firefox și Internet Explorer a inclus suport pentru analizarea și încărcarea în format JSON.
Tipuri de date native neacceptate
Sintaxa JavaScript definește mai multe tipuri de date native care nu sunt incluse în standardul JSON: Hartă, Set, Data, Eroare, Expresie uzuala, Funcție și altele. Aceste tipuri de date JavaScript trebuie să fie reprezentate într-un alt format, ambele programe fiind de acord asupra modului de conversie între tipuri. Există câteva standarde de facto astăzi, cum ar fi conversia unei date într-un șir, dar niciunul dintre ele nu este universal acceptat. Alte limbi pot avea un set diferit de tipuri native, care trebuie serializate cu atenție pentru a face față acestui tip de conversie.
Schema JSON
Schema este utilizată pentru a defini structura de date JSON pentru validare, documentare și gestionarea interacțiunii. Oferă un fel de contract pentru datele solicitate de aplicație și o modalitate de modificare.
Schema se bazează pe concepte din XML Schema (XSD), dar este proprietară. Ca și în XSD, aceleași facilități de serializare/dezerializare sunt utilizate atât pentru schemă, cât și pentru date.
Schema este un proiect de internet aflat în prezent în versiunea 5 (lansat pe 13 octombrie 2016). Există mai multe validatoare disponibile pentru diferite limbaje de programare, fiecare cu un nivel diferit de conformitate. Nu există o extensie de fișier standard, dar unii experți sugerează ca .schema.json să fie aprobat.
tip MIME
Tipul MIME oficial pentru textul JSON este „application/json”. Deși majoritatea implementărilor moderne au adoptat un tip MIME oficial, multe aplicații continuă să ofere suport pentru alte tipuri MIME. Mulți furnizori de servicii, browsere, servere, aplicații web, biblioteci, cadre și API-uri folosesc, așteaptă sau recunosc un tip MIME al cărui conținut arată ca „text/json” sau „text/javascript”. Exemple notabile includ Cautare Google API, Yahoo!, Flickr, Facebook API, DojoToolkit 0.4 și așa mai departe.
JSON-RPC
JSON-RPC este un protocol de apel de procedură la distanță (RPC) construit pe JSON, creat ca înlocuitor pentru XML-RPC sau SOAP. Este un protocol simplu care definește doar câteva tipuri de date și comenzi. Permite sistemului să trimită notificări (informații către un server care nu necesită un răspuns) și apeluri multiple către server la care se poate răspunde nefuncțional.
AJAJ
JavaScript asincron și JSON (sau AJAJ) se referă la aceeași metodologie de pagină web dinamică ca și Ajax, dar în loc de XML, formatul de date JSON este cel principal. AJAJ este o tehnologie de dezvoltare web care permite unei pagini web să solicite date noi după ce a fost încărcată în browser. De obicei, le redă de pe server ca răspuns la acțiunile utilizatorului pe pagina respectivă. De exemplu, ceea ce utilizatorul introduce într-o casetă de căutare, codul clientului îl trimite apoi către server, care răspunde imediat cu o listă derulantă cu elementele de bază de date care se potrivesc.
Probleme de securitate
Textul în format JSON este definit ca un obiect de serializare a datelor. Cu toate acestea, designul său, ca un subset liber al limbajului de scripting JavaScript, introduce mai multe preocupări de securitate. Se concentrează pe utilizarea interpretului Javascript pentru a executa dinamic text JSON, cum ar fi JavaScript inline. Acest lucru expune programul la scripturi eronate sau rău intenționate. Aceasta este o problemă serioasă atunci când lucrați cu date preluate de pe Internet.
Această metodă simplă și populară, dar riscantă, folosește compatibilitatea cu funcția JavaScripteval.
Unii dezvoltatori cred în mod eronat că textul JSON este, de asemenea, similar sintactic cu codul JavaScript, deși acest lucru este doar parțial adevărat. Prin urmare, se crede că o modalitate ușoară pentru un program JavaScript de a analiza date în acest format este să folosească funcția încorporată JavaScripteval, care a fost concepută pentru a evalua expresiile Javascript. În loc să folosească un parser specific, interpretul însuși este astfel folosit pentru a executa datele JSON, creând obiecte JavaScript native. Cu toate acestea, această metodă este riscantă dacă există posibilitatea ca datele JSON să conțină cod „javascript” arbitrar, care va fi apoi executat în același mod. Dacă nu sunt luate măsuri pentru validarea datelor mai întâi, metoda de evaluare este susceptibilă la vulnerabilități de securitate în care datele și toate Mediul JavaScript nu sunt sub controlul unei singure surse de încredere.
De exemplu, dacă datele nu sunt verificate, acestea sunt atacate de cod JavaScript rău intenționat. Astfel de încălcări pot crea, de asemenea, riscul de furt de date, falsificare de autentificare și alte posibile utilizări greșite a datelor și resurselor.
Deci, noua funcție JSON.parse a fost concepută ca o alternativă mai sigură la eval. Este conceput special pentru a procesa date JSON, nu JavaScript. Inițial a fost planificat să fie inclus în cea de-a patra ediție a standardului ECMAScript, dar acest lucru nu s-a întâmplat. A fost adăugat pentru prima dată în versiunea 5 și acum este acceptat de browserele majore.
JSON(JavaScript Object Notation) este un format simplu de schimb de date care este ușor de citit și de scris atât de oameni, cât și de computere. Se bazează pe un subset al limbajului de programare JavaScript, așa cum este definit în standardul ECMA-262 ediția a treia - decembrie 1999. JSON este un format de text care este complet independent de limbajul de implementare, dar folosește convenții familiare programatorilor de limbaje asemănătoare C, cum ar fi C, C++, C#, Java, JavaScript, Perl, Python și multe altele. Aceste proprietăți fac din JSON un limbaj ideal pentru schimbul de date.
JSON se bazează pe două structuri de date:
- Colecție de perechi cheie/valoare. În diferite limbi, acest concept este implementat ca un obiect, înregistrare, structură, dicționar, hash, listă cu nume sau matrice asociativă.
- O listă ordonată de valori. În majoritatea limbilor, acest lucru este implementat ca matrice, vector, listă sau secvență.
Acestea sunt structuri de date generice. Aproape toate limbajele de programare moderne le suportă într-o anumită formă. Este logic să presupunem că formatul de date, independent de limbajul de programare, ar trebui să se bazeze pe aceste structuri.
În notația JSON, arată astfel:
Un obiect este un set neordonat de perechi cheie/valoare. Un obiect începe cu o ( acolada de deschidere și se termină cu a ) acolada de închidere. Fiecare nume este urmat de: două puncte, perechile cheie/valoare sunt separate, o virgulă.
matrice- o colecție ordonată de valori. O matrice începe cu o [ paranteză pătrată de deschidere și se termină cu o paranteză pătrată de închidere ]. Valorile sunt separate prin virgulă.
Sens poate şirîntre ghilimele duble, număr, adevărat , fals , nul , obiect sau matrice. Aceste structuri pot fi imbricate.
Linia este o colecție de zero sau mai multe caractere Unicode, cuprinse între ghilimele duble, folosind \ ca caracter de escape. Un caracter este reprezentat ca un singur șir de caractere. Sintaxă similară este utilizată în C și Java.
Număr este prezentat în același mod ca în C sau Java, cu excepția faptului că este folosit numai sistem zecimal socoteala.
Spațiile pot fi folosite între orice jetoane.
Cu excepția unor detalii de codare, cele de mai sus descriu limbajul în întregime.