JSON podaci (.json)

RFC Standard

JavaScript Object Notation (JSON) je lagan, čitljiv tekstualni format za razmenu podataka koji podržavaju mnogi programski jezici i koji se često koristi u veb API-jima.

Konvertujte JSON u HTML

Besplatan konvertor JSON u HTML u pregledaču. Konvertujte datoteke odmah na svom uređaju.

Kompresujte JSON na mreži

Privatno - datoteke nikada ne napuštaju vaš uređaj

Pregled i metapodaci

Operativni sistemi i analizatori datoteka identifikuju JSON datoteke proverom početnog binarnog niza bajtova:

Izaberite ili prevucite datoteke ovde

Privatno - datoteke nikada ne napuštaju vaš uređaj

ili nalepite Ctrl+V
Garancija privatnosti: bez prenosa podataka preko mreže 0 bajtova poslato spoljnim serverima. Sva obrada je izvršena lokalno u bezbednom okruženju vašeg pregledača.

Potpis zaglavlja na nivou bajtova (magični bajtovi)

Operativni sistemi i analizatori datoteka identifikuju JSON datoteke proverom početnog binarnog niza bajtova:

HEKSADECIMALNI POTPIS (OFFSET 0):

7B or 5B

ASCII REPREZENTACIJA: { or [

Standardizacija: RFC 8259 / ECMA-404 / ISO/IEC 21778

Tehničke specifikacije

Arhitektura kontejneraLagan, tekstualni format za razmenu podataka nezavisan od jezika
KompresijaJSON tekst mogu da komprimuju Gzip, Brotli i Zstandard; veličina rezultata zavisi od podataka i podešavanja.
Bajtni redosled (Endianness)Unicode kodiran u UTF-8 (preporučuje se da nema Byte Order Mark / BOM oznake)
Prostori bojaNije primenljivo
Kanali i strukturaŠest osnovnih tipova podataka: objekat, niz, niska, broj, Bulova vrednost, null
Maksimalne dimenzijeNeograničeno; ograničeno samo memorijom parsera i maksimalnom dužinom niske
TransparentnostNije primenljivo
Strimovanje i progresivno učitavanjeNDJSON (Newline Delimited JSON) / JSON Lines omogućava progresivnu obradu strimova

Tehnička matrica poređenja: JSON u odnosu na konkurente

Tehnički atributJSON (Trenutno)YAMLXMLProtocol Buffers
Složenost sintakseMinimalna (6 tipova, stroga sintaksa)Visoka (bazirana na uvlačenju, složena specifikacija)Visoka (opširni zatvarajući tagovi, imenski prostori)Binarni format definisan šemom
Performanse parsiranjaIzuzetno brze u svim modernim jezicimaSpore (složeno parsiranje zasnovano na uvlačenju)Umerene do spore (zahtevno formiranje DOM stabla)Ultrabrze (binarna deserializacija bez kopiranja)
Podrška za komentareNe (namerno izostavljeni radi sprečavanja širenja metapodataka)Da (# komentara)Da (<!-- komentara -->)Da u .proto datotekama
Veličina mrežnog sadržajaKompaktan tekst; rezultati kompresije zavise od podataka i podešavanja.Kompaktan tekstOpširan tekst (teško ponavljanje tagova)Ultrakompaktan binarni format

Uobičajeni režimi oštećenja i vodič za heksadecimalni oporavak

Sintaksna greška: neočekivani znak , na poziciji X u JSON-u.

Osnovni uzrok: Završni zarez nakon poslednje stavke u nizu ili objektu, što je strogo zabranjeno standardom JSON RFC 8259.

Oporavak: Uklonite završne zareze iz ključeva objekata i elemenata niza pre prosleđivanja funkciji JSON.parse().

Sintaksna greška: neočekivani znak ' u JSON-u.

Osnovni uzrok: Niske ili ključevi stavljeni pod jednostruke navodnike ('') umesto pod dvostruke navodnike ("").

Oporavak: Zamenite sve niske i ključeve pod jednostrukim navodnicima standardnim niskama pod dvostrukim navodnicima.

Bezbednosna analiza i vektori napada parsera

JSON sadrži samo tekst i bezbedan je od direktnog izvršavanja koda, ali parsiranje JSON-a sa neproverenih izvora može dovesti do zagađenja prototipa (Prototype Pollution), ReDoS napada ili iscrpljivanja memorije.

Poznati vektori napada

  • Zagađenje prototipa (Prototype Pollution): Ključevi nazvani '__proto__' ili 'constructor' menjaju Object.prototype u JavaScript aplikacijama.
  • Uskraćivanje usluge usled prelivanja steka (Stack overflow DoS) preko duboko ugnežđenih JSON struktura (npr. 10.000 otvorenih zagrada).
  • Gubitak numeričke preciznosti: JavaScript brojevi veći od 2^53 - 1 (9.007.199.254.740.991) tiho gube preciznost.

Najbolje prakse za zaštitu: Nikada nemojte evaluirati JSON pomoću eval(). Koristite JSON.parse() i uklonite svojstva '__proto__' u rekurzivnim funkcijama za spajanje objekata.

Istorijat i prekretnice

2017RFC 8259 standardizuje UTF-8 kao jedino obavezno kodiranje karaktera za JSON.
2013ECMA-404 definiše JSON sintaksu koju koriste mnogi programski jezici i platforme.
2001Douglas Crockford definiše JSON kako bi omogućio komunikaciju podataka bez čuvanja stanja između pretraživača i servera.

Ključne prednosti

  • Čitljiv ljudima, samoopisujući i sažet tekstualni format.
  • Izvorna podrška za parsiranje ugrađena u JavaScript mašine (JSON.parse) i svaki veći programski jezik.
  • Stroga specifikacija sprečava proizvoljno izvršavanje koda.

Tehnička ograničenja i nedostaci

  • Nema podršku za komentare, završne zareze ili kružne reference objekata.
  • Nema izvorne binarne tipove (binarni podaci moraju biti kodirani u base64, što uvećava veličinu za 33%).
  • Neefikasna serijalizacija u poređenju sa binarnim formatima kao što su Protocol Buffers ili MessagePack.

Zanimljivosti

  • Douglas Crockford je dodao klauzulu o softverskoj licenci „The Software shall be used for Good, not Evil“ u originalne JSMin JSON alate.
  • JSON je strogi podskup JavaScript sintakse, ali sve do ES2019, sirovi neescapovani U+2028 i U+2029 karakteri bili su validni u JSON-u, ali nevalidni u JavaScript niskama.
  • Douglas Crockford je otkrio da rani veb pretraživači mogu direktno da procene JSON u objekte koristeći ugrađenu JavaScript funkciju eval() pre nego što su namenski JSON.parse() API-ji standardizovani u ECMAScript 5.

Često postavljana tehnička pitanja

Zašto JSON ne dozvoljava komentare?

JSON gramatika ne dozvoljava komentare. Implementacije mogu različito obrađivati proširenja i podatke specifične za aplikaciju, pa sam format ne garantuje interoperabilnost.

Kako da sačuvate 64-bitne cele brojeve u JSON-u bez gubitka preciznosti?

Izvorni tip Number u JavaScript-u je IEEE 754 broj sa pokretnim zarezom dvostruke preciznosti, koji precizno podržava samo cele brojeve do 2^53 - 1. 64-bitni celi brojevi (kao što su identifikatori baze podataka ili vremenske oznake) moraju se serijalizovati kao niske (npr. '1234567890123456789') u JSON-u.

Koja je razlika između JSON-a i NDJSON / JSON Lines formata?

Standardni JSON obuhvata ceo sadržaj u jedinstveni korenski objekat ili niz, što zahteva od parsera da učitaju ceo tekst pre obrade. NDJSON (Newline Delimited JSON) razdvaja pojedinačne validne JSON zapise znakovima za novi red (\n), omogućavajući efikasno strimovanje masivnih skupova podataka veličine nekoliko gigabajta red po red.