Situatie
JSON (JavaScript Object Notation) este un format standardizat pentru reprezentarea datelor structurate. Deși JSON a apărut din limbajul de programare JavaScript, acum este o metodă omniprezentă de schimb de date între sisteme. Majoritatea API-urilor moderne acceptă solicitări JSON și emit răspunsuri JSON, așa că este util să aveți o cunoaștere bună a formatului și a caracteristicilor acestuia.
Un exemplu de bază JSON
{ "id": 1001, "title": "What is JSON?", "author": { "id": 1, "name": "James Walker" }, "tags": ["api", "json", "programming"], "published": false, "publishedTimestamp": null }
Acest exemplu demonstrează toate tipurile de date JSON. De asemenea, ilustrează concizia datelor în format JSON, una dintre caracteristicile care le-au făcut atât de atrăgătoare pentru utilizare în API-uri. În plus, JSON este relativ ușor de citit așa cum este, spre deosebire de formatele mai detaliate, cum ar fi XML.
Tipuri de date JSON
Șase tipuri de date pot fi reprezentate nativ în JSON:
Șiruri – Șirurile sunt scrise între ghilimele duble; caracterele pot fi eliminate folosind barele oblice inverse.
Numere – Numerele sunt scrise ca cifre fără ghilimele. Puteți include o componentă fracțională pentru a desemna un float. Majoritatea implementărilor de analiză JSON presupun un număr întreg atunci când nu este prezentă nicio virgulă zecimală.
Booleeni – Sunt acceptate valorile literale true și false.
Null – Valoarea literală nulă poate fi utilizată pentru a semnifica o valoare goală sau omisă.
Matrice – O matrice este o listă simplă notată prin paranteze drepte. Fiecare element din listă este separat prin virgulă. Matricele pot conține orice număr de articole și pot folosi toate tipurile de date acceptate.
Obiecte – Obiectele sunt create prin paranteze. Sunt o colecție de perechi cheie-valoare în care cheile sunt șiruri, înfășurate între ghilimele duble. Fiecare cheie are o valoare care poate prelua oricare dintre tipurile de date disponibile. Puteți imbrica obiecte pentru a crea ierarhii în cascadă. O virgulă trebuie să urmeze fiecare valoare, ceea ce înseamnă sfârșitul acelei perechi cheie-valoare.
Analizoarele JSON convertesc automat aceste tipuri de date în structuri adecvate limbajului lor. Nu trebuie să aruncați manual id-ul într-un număr întreg, de exemplu. Analizarea întregului șir JSON este suficientă pentru a mapa valorile înapoi la formatul lor original de date.
Semantică și validare
JSON are anumite reguli care trebuie respectate atunci când vă codificați datele. Șirurile care nu aderă la sintaxă nu vor fi analizate de către consumatori.
Este deosebit de important să acordați atenție ghilimelelor din jurul șirurilor de caractere și cheilor obiectelor. De asemenea, trebuie să vă asigurați că este folosită o virgulă după fiecare intrare într-un obiect sau matrice. Cu toate acestea, JSON nu permite o virgulă finală după ultima intrare – includerea neintenționată a uneia este o cauză comună a erorilor de validare. Majoritatea editorilor de text vă vor evidenția problemele de sintaxă, ajutând la descoperirea greșelilor.
În ciuda acestor puncte de deplasare comune, JSON este unul dintre cele mai ușor formate de date de scris manual. Majoritatea oamenilor găsesc sintaxa rapidă și convenabilă odată ce se familiarizează cu ea. În general, JSON tinde să fie mai puțin predispus la erori decât XML, unde etichetele de deschidere și de închidere nepotrivite, declarațiile de schemă nevalide și problemele de codificare a caracterelor cauzează adesea probleme.
Desemnarea conținutului JSON
Extensia .json este utilizată în mod normal atunci când JSON este salvat într-un fișier. Conținutul JSON are tipul MIME standard application/json, deși text/json este uneori folosit din motive de compatibilitate. În prezent, ar trebui să vă bazați pe aplicație/json pentru anteturile HTTP Accept și Content-Type.
Majoritatea API-urilor care folosesc JSON vor încapsula totul într-un obiect de nivel superior:
{ "error": 1000 }
Totuși, acest lucru nu este necesar – un tip literal este valid ca nod de nivel superior într-un fișier, astfel încât următoarele exemple sunt toate JSON valide:
1000
true
null
Ei vor decoda la scalarii lor respectivi în limbajul dvs. de programare.
Lucrul cu JSON
Majoritatea limbajelor de programare au suport JSON încorporat. Iată cum să interacționați cu datele JSON în câteva medii populare.
JavaScript
În JavaScript, metodele JSON.stringify() și JSON.parse() sunt folosite pentru a codifica și decoda șirurile JSON:
const post = { id: 1001, title: "What Is JSON?", author: { id: 1, name: "James Walker" } }; const encodedJson = JSON.stringify(post); // {"id": 1001, "title": "What Is JSON?", ...} console.log(encodedJson); const decodedJson = JSON.parse(encodedJson); // James Walker console.log(decodedJson.author.name);
PHP
Funcțiile echivalente în PHP sunt json_encode() și json_decode():
$post = [ "id" => 1001, "title" => "What Is JSON?", "author" => [ "id" => 1, "name" => "James Walker" ] ]; $encodedJson = json_encode($post); // {"id": 1001, "title": "What Is JSON?", ...} echo $encodedJson; $decodedJson = json_decode($encodedJson, true); // James Walker echo $decodedJson["author"]["name"];
Piton
Python oferă json.dumps() și json.loads() pentru a serializa și, respectiv, a deserializa:
import json post = { "id": 1001, "title": "What Is JSON?", "author": { "id": 1, "name": "James Walker" } } encodedJson = json.dumps(post) # {"id": 1001, "title": "What Is JSON?", ...} print(encodedJson) decodedJson = json.loads(encodedJson) # James Walker print(decodedJson["author"]["name"])
Ruby
Ruby oferă JSON.generate și JSON.parse:
require "json" post = { "id" => 1001, "title" => "What Is JSON?", "author" => { "id" => 1, "name" => "James Walker" } } encodedJson = JSON.generate(post) # {"id": 1001, "title": "What Is JSON?", ...} puts encodedJson decodedJson = JSON.parse(encodedJson) # James Walker puts decodedJson["author"]["name"]
Limitări JSON
JSON este un format ușor care se concentrează pe transmiterea valorilor în structura dvs. de date. Acest lucru îl face rapid de analizat și ușor de lucrat, dar înseamnă că există dezavantaje care pot provoca frustrare. Iată câteva dintre cele mai mari probleme.
Fara comentarii
Datele JSON nu pot include comentarii. Lipsa adnotărilor reduce claritatea și vă obligă să puneți documentația în altă parte. Acest lucru poate face JSON nepotrivit pentru situații precum fișierele de configurare, în care modificările sunt rare și scopurile câmpurilor ar putea fi neclare.
Fara Scheme
JSON nu vă permite să definiți o schemă pentru datele dvs. Nu există nicio modalitate de a impune că id-ul este un câmp întreg obligatoriu, de exemplu. Acest lucru poate duce la structuri de date malformate neintenționat.
Fără referințe
Câmpurile nu pot face referire la alte valori din structura de date. Acest lucru cauzează adesea repetare care mărește dimensiunea fișierului. Revenind la exemplul de postare pe blog de mai devreme, ați putea avea o listă de postări de blog după cum urmează:
{ "posts": [ { "id": 1001, "title": "What is JSON?", "author": { "id": 1, "name": "James Walker" } }, { "id": 1002, "title": "What is SaaS?", "author": { "id": 1, "name": "James Walker" } } ] }
Ambele postări au același autor, dar informațiile asociate cu acel obiect au trebuit să fie duplicate. Într-o lume ideală, implementările parserului JSON ar putea produce structura prezentată mai sus din intrare similară cu următoarea:
{ "posts": [ { "id": 1001, "title": "What is JSON?", "author": "{{ .authors.james }}" }, { "id": 1002, "title": "What is SaaS?", "author": "{{ .authors.james }}" } ], "authors": { "james": { "id": 1, "name": "James Walker" } } }
Acest lucru nu este posibil în prezent cu JSON standard.
Fără tipuri de date avansate
Cele șase tipuri de date acceptate omit multe tipuri comune de valori. JSON nu poate stoca în mod nativ date, ore sau puncte de localizare geografică, așa că trebuie să decideți propriul format pentru aceste informații. Acest lucru cauzează discrepanțe incomode și cazuri marginale. Dacă aplicația dvs. gestionează marcajele de timp ca șiruri, cum ar fi 2022-07-01T12:00:00+00:00, dar un API extern prezintă timpul ca secunde după epoca Unix – 1657287000 – va trebui să vă amintiți când să utilizați fiecare dintre formate.
Leave A Comment?