JSON

Versiunea actuală a paginii nu a fost încă examinată de colaboratori experimentați și poate diferi semnificativ de versiunea revizuită pe 28 august 2021; verificările necesită 14 modificări .
JSON
Extensie .json[unu]
tip MIME aplicație/json [2]
Tip de format Schimb de date
Extins din JavaScript
Standard(e) RFC 8259
Site-ul web json.org
 Fișiere media la Wikimedia Commons

JSON ( în engleză  JavaScript Object Notation , pronunțată de obicei ca / ​​ˈ dʒ s ən / JAY-sən [3] ) este un format de schimb de date bazat pe text , bazat pe JavaScript . La fel ca multe alte formate de text, JSON este ușor de citit de oameni. Formatul JSON a fost dezvoltat de Douglas Crockford [4] .

În ciuda faptului că este derivat din JavaScript (mai precis, un subset de limbaj al standardului ECMA-262 din 1999 ), formatul este considerat independent de limbaj și poate fi folosit cu aproape orice limbaj de programare . Pentru multe limbi, există un cod gata făcut pentru crearea și procesarea datelor în format JSON.

Utilizare

Datorită conciziei sale în comparație cu XML , formatul JSON poate fi mai potrivit pentru serializarea structurilor complexe. Este folosit în aplicațiile web atât pentru schimbul de date între browser și server ( AJAX ), cât și între servere (pereche HTTP programatice ).

Deoarece formatul JSON este un subset al sintaxei limbajului JavaScript, acesta poate fi deserializat rapid cu JSON.parse().

Sintaxă

Textul JSON este (codificat) una dintre cele două structuri:

Structurile de date utilizate de JSON sunt suportate de orice limbaj de programare modern, ceea ce face posibilă utilizarea JSON pentru a face schimb de date între diferite limbaje de programare și sisteme software.

Următoarele pot fi folosite ca valori în JSON:

Un șir este foarte asemănător cu un literal de același tip de date în JavaScript . Un număr este, de asemenea, foarte asemănător cu un număr JavaScript, cu excepția faptului că folosește doar format zecimal (cu un punct ca separator). Pot fi inserate spații între oricare două elemente de sintaxă.

Următorul exemplu arată o reprezentare JSON a datelor despre un obiect care descrie o persoană. Datele conțin câmpuri șiruri de nume și prenume , informații despre adresă și o matrice care conține o listă de numere de telefon. După cum puteți vedea din exemplu, valoarea poate fi o structură imbricată.

{ "firstName" : "Ivan" , "lastName" : "Ivanov" , "address" : { "streetAddress" : "Moskovskoe sh., 101, kv.101" , "city" : "Leningrad" , "postalCode" : 101101 }, „phoneNumbers” : [ „812 123-1234” , „916 123-4567” ] }

Atât numerele, cât și șirurile de caractere pot fi folosite ca valori în JSON. Prin urmare, înregistrarea "postalCode": "101101"conține un șir și "postalCode": 101101 - deja o valoare numerică. Din cauza tastării slabe în JavaScript și PHP , un șir poate fi turnat într-un număr și să nu afecteze logica programului. Cu toate acestea, se recomandă să tratați cu atenție tipul de valoare, deoarece JSON este utilizat pentru schimbul între sisteme.

În XML, o astfel de structură ar arăta cam așa:

<persoană> <firstName> Ivan </firstName> <lastName> Ivanov </lastName> <adresă> <streetAddress> Moskovskoye sh., 101, kv.101 </streetAddress> <city> Leningrad </city> <postalCode> 101101 </postalCode> </address> <phoneNumbers> <phoneNumber> 812 123-1234 </phoneNumber> <phoneNumber> 916 123-4567 </phoneNumber> </phoneNumbers> </person>

sau cam asa:

<person firstName= "Ivan" lastName= "Ivanov" > <address streetAddress= "101 Moskovskoye sh., apt. 101" city= "Leningrad" postalCode= "101101" /> <phoneNumbers> <phoneNumber> 812 123-1234 < /phoneNumber> <phoneNumber> 916 123-4567 </phoneNumber> </phoneNumbers> </persoană>

JSON5

JSON5  este o extensie propusă a formatului json în conformitate cu sintaxa ECMAScript 5, datorită faptului că json este folosit nu numai pentru comunicarea între programe, ci și creat/editat manual [6] . Un fișier JSON5 este întotdeauna un cod ECMAScript 5 valid. JSON5 este compatibil cu JSON. Pentru unele limbaje de programare există deja analizoare json5 [7] .

Câteva inovații:

  • Sunt acceptate atât comentariile pe o singură linie, cât //și comentariile pe mai multe rânduri./* */
  • Înregistrările și listele pot avea o virgulă după ultimul element (util la copierea elementelor).
  • Cheile de intrare pot fi fără ghilimele dacă sunt identificatori ECMAScript 5 validi.
  • Șirurile pot fi cuprinse fie între ghilimele simple, fie duble.
  • Numerele pot fi în hexazecimal, începe sau se termină cu un punct zecimal, includ Infinit, -Infinit, NaN și -NaN și încep cu semnul +.

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” [8] . Cel mai comun parser YAML este, de asemenea, capabil să gestioneze JSON [9] . Specificația YAML anterioară 1.2 nu acoperea pe deplin JSON, în primul rând din cauza lipsei de suport nativ pentru UTF-32 a YAML , precum și din cauza 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:

  • suport pentru date relaționale : într-un document YAML, puteți face referire la o ancoră care a fost întâlnită anterior într-un fișier / flux; structuri recursive pot fi exprimate în acest fel .
  • suport pentru tipuri de date extensibile dincolo de primitive : șiruri, numere, boolean etc.
  • suport de sintaxă bloc cu indentări; vă permite să descrieți date structurate fără a utiliza caractere suplimentare: tot felul de paranteze, ghilimele etc.

Schema JSON

Schema JSON este una 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 folosit pentru a procesa date și a descrie valabilitatea acestora, pot fi folosite aceleași instrumente de serializare / deserializare [10] .

Format JSON-LD pentru date legate

Standardul JSON nu acceptă referințe la obiecte , dar puteți obține rezultatul dorit cu convenții suplimentare. Recomandarea W3C pentru datele legate este JSON-LD , care utilizează modelul de date RDF . În JSON-LD, un context (context) este adăugat la date, legând proprietățile obiectelor document JSON cu elemente de ontologie [11] .

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 de server a programului este omisă; ar trebui să conțină cod care trimite date în format șir JSON ca răspuns la solicitările pentru url).

var http_request = new XMLHttpRequest (); http_request . onreadystatechange = function () { if ( http_request . readyState !== 4 ) return ; if ( http_request . status !== 200 ) throw new Error ( 'cererea a fost învinsă' ); face_something_with_object ( JSON . parse ( http_request . responseText )); http_request = null ; }; http_request . deschide ( "GET" , url , true ); http_request . trimite ( nul );

Rețineți că acest exemplu XMLHttpRequest nu acceptă Internet Explorer până la versiunea 6 inclusiv, așa că trebuie utilizat cod ușor diferit pentru ele. Posibilitățile de utilizare XMLHttpRequest sunt limitate datorită aceleiași politici de origine: răspunsul URL la cerere trebuie să fie în același domeniu DNS cu serverul care găzduiește pagina care solicită răspunsul. Alternativ, se folosește o abordare JSONP , care implică utilizarea unui apel de funcție codificat transmis între client și server, astfel încât clientul să poată încărca date codificate JSON de pe domenii terțe și să notifice apelantul cu privire la finalizare, deși acest lucru introduce o anumită securitate. riscuri și cerințe suplimentare de server.

Alternativ, puteți utiliza elemente din codul paginii <iframe>pentru a solicita date JSON în mod asincron sau pur și simplu <form action="url_to_cgi_script">. Aceste abordări au fost predominante înainte de suportul larg răspândit pentru XMLHttpRequest.

De asemenea, puteți utiliza etichete dinamice pentru a transmite date JSON <script>. Această metodă poate ocoli aceeași politică de origine, dar introduce cod vulnerabil. JSONRequest a fost sugerat ca o alternativă mai sigură .

Probleme de securitate

Deși JSON este destinat să fie serializat, sintaxa sa este similară cu JavaScript și acest lucru creează o serie de probleme de securitate. Adesea, o funcție este aplicată datelor primite de la o sursă externă în format JSON eval()fără nicio validare preliminară.

JavaScript eval()

Deoarece JSON este reprezentat ca o bucată de cod JavaScript corectă din punct de vedere sintactic, cel mai simplu mod de a analiza date JSON într-un program JavaScript este să utilizați funcția încorporată JavaScript eval(), care este concepută pentru a executa expresii JavaScript. Cu această abordare, nu este nevoie să folosiți analizatori suplimentari.

Tehnica de utilizare eval()face sistemul vulnerabil dacă sursa datelor JSON utilizate nu este de încredere . date pot fi cod JavaScript rău intenționat pentru atacurile Code Injection Folosind această vulnerabilitate, este posibil să se efectueze furt de date, falsificare de autentificare.

A fost propusă o nouă funcție JSON.parse()care poate procesa doar 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” [12] . Este disponibil în prezent ca bibliotecă JavaScript [13] și a fost 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.

Falsificarea cererii pe mai multe domenii

Utilizarea prost concepută a JSON face site-urile vulnerabile la falsificarea cererilor între site-uri (CSRF sau XSRF) [14] . Deoarece eticheta <script>permite utilizarea unei surse care nu aparține aceluiași domeniu cu resursa utilizată, aceasta permite executarea codului sub masca datelor JSON în contextul unei pagini arbitrare, ceea ce face posibilă compromiterea parolelor sau alte informații sensibile ale utilizatorilor care sunt autorizați pe alt site.

Aceasta pare a fi o problemă doar dacă datele JSON conțin informații sensibile care pot fi compromise de o terță parte și dacă serverul se bazează pe politică de origine pentru a bloca accesul la date atunci când întâlnește o solicitare externă Aceasta nu este o problemă dacă serverul determină validitatea cererii, furnizând date doar dacă aceasta este corectă. Un cookie HTTP nu poate fi utilizat pentru a determina acest lucru. Utilizarea exclusivă a unui cookie HTTP este exploatată prin falsificarea cererilor pe mai multe site-uri .

JSONP și JSONPP

JSONP ( JSON Padding )   este o extensie a JSON atunci când numele unei funcții de apel invers este specificat ca argument de intrare.

Tehnologia se bazează pe faptul că politica de securitate a browserului nu interzice utilizarea etichetei <script type="text/javascript" src="…"></script>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, așa:

{ „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):

<script type="text/javascript" src="http://example.com/getjson?jsonp=parseResponse"></script>

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 ({ "paper" : "A4" , "count" : 5 })

Acum codul apelează funcția javascript a primului domeniu.

Ideea a fost propusă inițial pe blogul MacPython în 2005 [15] și este utilizată în prezent de multe aplicații Web 2.0 precum Dojo Toolkit Applications, Google Toolkit Applications [ https://www.webcitation.org/6Djo88laj?url=http: / /www.gwtapps.com/?p=42%5d și Zanox Web Services. Au fost propuse extensii suplimentare la acest protocol pentru a include argumente suplimentare, cum ar fi în cazul JSONPP [16] suportat de serviciile web S3DB .

Deoarece JSONP folosește etichete de script, apelurile sunt în esență deschise lumii. Din acest motiv, este posibil ca JSONP să nu fie adecvat pentru stocarea datelor sensibile [17] .

Includerea etichetelor de script de pe site-uri la distanță le permite să transmită orice conținut de pe site. Dacă site-ul de la distanță are vulnerabilități care permit injectarea Javascript, atunci site-ul original poate fi și el afectat.

JSONPP ( ing.  JSON parametrizat cu padding  - „JSON parametrizat cu padding”) - dezvoltarea ideii JSONP.

JSONPP include adresa URL sursă, 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

ans = JSONP ( SRC ) { eval ( JSONPP ( ans )); eval ( ÎNCĂRCARE ); }

Î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 . aleatoriu (). toString (). înlocuiți ( /\./g , "" ); var headID = document . getElementsByTagName ( "cap" )[ 0 ]; var script = document . createElement ( 'script' ); scenariu . id = apel ; scenariu . tip = 'text/javascript' ; // utilizând json src parametrizat, căptușit = src + "&format=json&jsonp=s3db_jsonpp&jsonpp=" + next_eval + "&onload=remove_element_by_id('" + script . id + "')" ; scenariu . src = src ; headID . appendChild ( script ); // preluați răspunsul } function s3db_jsonpp ( ans , jsonpp ){ eval ( jsonpp ); return ans ; } funcția remove_element_by_id ( id ){ var e = document . getElementById ( id ); e . parentNode . removeChild ( e ); returnează fals ; }

În exemplu, funcția s3db_jsonpp_call()creează un element de script în partea principală a DOM al cărui src se potrivește cu apelul JSONPP.

După primirea unui răspuns de la server, acesta va fi apelat s3db_jsonpp() - este transmis în parametrii de apel, așa cum ar trebui să fie conform regulilor JSONP.

Intern , s3db_jsonpp()va funcționa eval(jsonpp), iar valoarea ans va fi returnată.

Apelarea eval(onload) are ca rezultat execuția remove_element_by_id()cu id-ul scriptului creat în head și eventual ștergerea 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.

jsonb

JSONB este o extensie JSON binară introdusă în PostgreSQL în versiunea 9.4.18. De fapt, JSONB este o reprezentare binară a lui JSON [18] , cu diferența că spațiile sunt eliminate din șirurile stocate, sortarea obiectelor nu este păstrată și doar ultima valoare pentru cheile duplicate este stocată [19] .

Vezi și

Note

  1. https://www.file-extension.info/format/json
  2. Crockford D. The application/json Media Type for JavaScript Object Notation (JSON)  (engleză) - IETF , 2006. - 10 p. doi : 10.17487/RFC4627
  3. Doug Crockford „Google Tech Talks: JavaScript: The Good Parts” (7 februarie 2009). Preluat la 28 septembrie 2017. Arhivat din original la 29 iulie 2017.
  4. JSON Redux AKA RFC7159 . Consultat la 12 septembrie 2014. Arhivat din original la 2 iulie 2014.
  5. JSON-RPC 1.1 Alt: Nume de servicii, proceduri și parametri . Consultat la 28 aprilie 2016. Arhivat din original pe 9 martie 2016.
  6. JSON5 de aseemk . Consultat la 26 noiembrie 2015. Arhivat din original la 11 decembrie 2015.
  7. In The Wild json5/json5 Wiki GitHub . Consultat la 27 ianuarie 2017. Arhivat din original la 5 decembrie 2020.
  8. YAML Ain't Markup Language (YAML™) Versiunea 1.2  (  link mort) . — Proiect de lucru 2008-05-11. Data accesului: 24 septembrie 2009. Arhivat din original la 16 mai 2008.
  9. YAML este JSON . RedHanded (7 aprilie 2005). Preluat la 25 septembrie 2012. Arhivat din original la 7 decembrie 2012. .
  10. json.com. Propunere de schemă JSON  (engleză)  (link nu este disponibil) . Arhivat din original pe 14 mai 2008.
  11. Sintaxa JSON-LD 1.0 (27 decembrie 2011). Data accesului: 30 decembrie 2011. Arhivat din original la 12 ianuarie 2012.
  12. ↑ JSON : O alternativă fără grăsimi la XML  . Arhivat din original pe 12 februarie 2012.
  13. json2.js  . _ Consultat la 24 septembrie 2009. Arhivat din original la 12 februarie 2012.
  14. Jeremy Grossman. Tehnici avansate de atac pentru aplicațiile web care utilizează  Gmail . securitate cu pălărie albă. Consultat la 23 septembrie 2009. Arhivat din original pe 12 februarie 2012.
  15. din __future__ import * » JSON la distanță - JSONP . Bob.pythonmac.org. Consultat la 8 septembrie 2008. Arhivat din original pe 12 februarie 2012.
  16. Almeida, Jonas. JSON, JSONP, JSONPP?  (neopr.) . - S3DB, 2008. - 11 iunie. Arhivat din original pe 15 februarie 2017.
  17. RIAspot. JSON P pentru Cross Site XHR (link indisponibil) . Arhivat din original pe 5 decembrie 2008. 
  18. Când să folosiți tipuri de date nestructurate în PostgreSQL? Hstore vs. JSON vs. JSONB  (rusă)  (29 iulie 2016). Arhivat din original pe 4 iulie 2018. Preluat la 4 iulie 2018.
  19. De ce PostgreSQL este mai bun decât alte baze de date SQL open source. Partea 1  (rusă)  (29 aprilie 2016). Arhivat din original pe 4 iulie 2018. Preluat la 4 iulie 2018.

Link -uri