Ce este JSON și cum îl folosiți?

Publicat: 2022-08-14
Imagine cu textul „JSON” suprapus pe monitorul unui computer
Maria Vonotna/Shutterstock.com

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.

În acest articol, vom explica ce este JSON, cum exprimă diferite tipuri de date și modalitățile în care îl puteți produce și consuma în limbaje de programare populare. Vom acoperi, de asemenea, unele dintre limitările JSON și alternativele care au apărut.

Bazele JSON

JSON a fost conceput inițial de Douglas Crockford ca un format apatrid pentru comunicarea datelor între browsere și servere. La începutul anilor 2000, site-urile web începeau să preia asincron date suplimentare de pe serverul lor, după încărcarea inițială a paginii. Fiind un format bazat pe text derivat din JavaScript, JSON a simplificat preluarea și consumarea datelor în cadrul acestor aplicații. Specificația a fost în cele din urmă standardizată ca ECMA-404 în 2013.

JSON este întotdeauna transmis ca șir. Aceste șiruri pot fi decodificate într-o gamă de tipuri de date de bază, inclusiv numere, booleeni, matrice și obiecte. Aceasta înseamnă că ierarhiile și relațiile obiectelor pot fi păstrate în timpul transmisiei, apoi reasamblate la capătul de recepție într-un mod adecvat pentru mediul de programare.

Un exemplu de bază JSON

Aceasta este o reprezentare JSON a unei postări de blog:

 {
    „id”: 1001,
    "title": "Ce este JSON?",
    „autor”: {
        „id”: 1,
        „nume”: „James Walker”
    },
    „etichete”: [„api”, „json”, „programare”],
    „publicat”: fals,
    „publishedTimestamp”: nul
}

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 atractive 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ă null 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 de caractere, î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 application/json pentru anteturile HTTP Accept și Content-Type .

Majoritatea API-urilor care folosesc JSON vor încapsula totul într-un obiect de nivel superior:

 {
    „eroare”: 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 
 Adevărat 
 nul

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 : "Ce este JSON?" ,
    autor : {
        id : 1 ,
        nume : "James Walker"
    }
} ;

const encodedJson = JSON. stringify ( post ) ;

// {"id": 1001, "title": "Ce este JSON?", ...}
consolă. log ( encodedJson ) ;

const decodedJson = JSON. parse ( encodedJson ) ;

// James Walker
consolă. jurnal ( decodedJson. autor . nume ) ;

PHP

Funcțiile echivalente în PHP sunt json_encode() și json_decode() :

 $post = [
    "id" => 1001 ,
    "title" => "Ce este JSON?" ,
    „autor” => [
        "id" => 1 ,
        "name" => "James Walker"
    ]
] ;

$encodedJson = json_encode ( $post ) ;

// {"id": 1001, "title": "Ce este JSON?", ...}
echo $encodedJson ;

$decodedJson = json_decode ( $encodedJson , true ) ;

// James Walker
echo $decodedJson [ "autor" ] [ "nume" ] ;

Piton

Python oferă json.dumps() și json.loads() pentru a serializa și, respectiv, a deserializa:

 import json

post = {
    „id” : 1001 ,
    "title" : "Ce este JSON?" ,
    „autor” : {
        "id" : 1 ,
        "name" : "James Walker"
    }
}

encodedJson = json. gropi ( post )

# {"id": 1001, "title": "Ce este JSON?", ...}
imprimare ( encodJson )

decodedJson = json. incarca ( encodedJson )

# James Walker
print ( decodedJson [ "autor" ] [ " nume " ] )

Rubin

Ruby oferă JSON.generate și JSON.parse :

 necesită „json”

post = {
    "id" => 1001 ,
    "title" => "Ce este JSON?" ,
    „autor” => {
        "id" => 1 ,
        "name" => "James Walker"
    }
}

encodedJson = JSON. genera ( post )

# {"id": 1001, "title": "Ce este JSON?", ...}
pune encodedJson

decodedJson = JSON. parse ( encodJson )

# James Walker
pune decodedJson [ "autor" ] [ "nume" ]

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 repetiții care măresc 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ă:

 {
    „postări”: [
        {
            „id”: 1001,
            "title": "Ce este JSON?",
            „autor”: {
                „id”: 1,
                „nume”: „James Walker”
            }
        },
        {
            „id”: 1002,
            "title": "Ce este SaaS?",
            „autor”: {
                „id”: 1,
                „nume”: „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:

 {
    „postări”: [
        {
            „id”: 1001,
            "title": "Ce este JSON?",
            „author”: „{{ .authors.james }}”
        },
        {
            „id”: 1002,
            "title": "Ce este SaaS?",
            „author”: „{{ .authors.james }}”
        }
    ],
    „autori”: {
        "James": {
            „id”: 1,
            „nume”: „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ă vă 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.

Alternative JSON

YAML este cea mai importantă alternativă JSON. Este un superset al formatului care are o prezentare mai citită de om, tipuri de date personalizate și suport pentru referințe. Este destinat să abordeze majoritatea provocărilor de utilizare asociate cu JSON.

YAML a fost adoptat pe scară largă pentru fișierele de configurare și în DevOps, IaC și instrumentele de observabilitate. Este mai rar folosit ca format de schimb de date pentru API-uri. Complexitatea relativă a YAML înseamnă că este mai puțin accesibil pentru noii veniți. Micile erori de sintaxă pot cauza erori de analiză confuze.

Tamponele de protocol (protobufs) sunt un alt competitor JSON în curs de dezvoltare conceput pentru a serializa datele structurate. Protobuf-urile au declarații de tip de date, câmpuri obligatorii și suport pentru majoritatea limbajelor de programare majore. Sistemul câștigă popularitate ca modalitate mai eficientă de transmitere a datelor prin rețele.

rezumat

JSON este un format de reprezentare a datelor bazat pe text care poate codifica șase tipuri de date diferite. JSON a devenit un element de bază al ecosistemului de dezvoltare software; este susținut de toate limbajele de programare majore și a devenit alegerea implicită pentru majoritatea API-urilor REST dezvoltate în ultimele două decenii.

Deși simplitatea JSON face parte din popularitatea sa, impune și limitări asupra a ceea ce puteți obține cu formatul. Lipsa suportului pentru scheme, comentarii, referințe la obiecte și tipuri de date personalizate înseamnă că unele aplicații vor descoperi că depășesc ceea ce este posibil cu JSON. Alternativele mai tinere, cum ar fi YAML și Protobuf, au ajutat la abordarea acestor provocări, în timp ce XML rămâne un competitor pentru aplicațiile care doresc să definească o schemă de date și nu le deranjează verbozitatea.