JSON-gegevens (.json)

RFC Standaard

JavaScript Object Notation (JSON) is een lichtgewicht, door mensen leesbaar tekstformaat voor gegevensuitwisseling, ondersteund door vele programmeertalen en vaak gebruikt in web-API's.

JSON naar HTML converteren

Gratis JSON-naar-HTML-converter in uw browser. Converteer bestanden direct op uw apparaat.

JSON online comprimeren

Privé - bestanden verlaten uw apparaat niet

Inspecteren en metadata

Besturingssystemen en bestandsanalysators herkennen JSON-bestanden aan de hand van de eerste binaire bytesequentie:

Selecteer of sleep bestanden hierheen

Privé - bestanden verlaten uw apparaat niet

of plak Ctrl+V
Privacygarantie zonder netwerktransmissie: 0 bytes geüpload naar externe servers. Alle verwerking vond lokaal plaats in uw browser-sandbox.

Bestandshandtekening op byteniveau (magic bytes)

Besturingssystemen en bestandsanalysators herkennen JSON-bestanden aan de hand van de eerste binaire bytesequentie:

HEX-HANDTEKENING (OFFSET 0):

7B of 5B

ASCII-WEERGAVE: { of [

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

Technische specificaties

ContainerarchitectuurLichtgewicht, op tekst gebaseerd, taalonafhankelijk gegevensuitwisselingsformaat
CompressieGzip, Brotli en Zstandard kunnen JSON-tekst comprimeren; de resulterende grootte hangt af van de gegevens en instellingen
Bytevolgorde (endianness)UTF-8-gecodeerde Unicode (een Byte Order Mark (BOM) wordt afgeraden)
KleurruimtenNiet van toepassing
Kanalen en structuurZes basistypen: object, array, string, getal, boolean, null
Maximale afmetingenOnbeperkt; alleen beperkt door het geheugen van de parser en de maximale tekenreekslengte
TransparantieNiet van toepassing
Streaming en progressiefNDJSON (Newline Delimited JSON) / JSON Lines maakt progressieve streamverwerking mogelijk

Technische vergelijkingsmatrix: JSON versus concurrenten

Technisch kenmerkJSON (Huidig)YAMLXMLProtocol Buffers
SyntaxiscomplexiteitMinimaal (6 typen, strikte syntaxis)Hoog (gebaseerd op inspringing, complexe specificatie)Hoog (uitgebreide sluitende tags, naamruimten)Via schema gedefinieerd binair transportformaat
ParsingprestatiesExtreem snel in alle moderne talenTraag (complexe inspringingsparsing)Matig tot traag (zware DOM-constructie)Ultrasnel (zero-copy binaire deserialisatie)
Ondersteuning voor opmerkingenNee (bewust weggelaten om wildgroei van metadata te voorkomen)Ja (# opmerkingen)Ja (<!-- opmerkingen -->)Ja in .proto-bestanden
Grootte van netwerkpayloadCompacte tekst; compressieresultaten hangen af van de gegevens en instellingenCompacte tekstUitgebreide tekst (veel herhaling van tags)Ultracompact binair

Veelvoorkomende beschadigingen en gids voor hex-herstel

SyntaxError: Unexpected token , in JSON at position X.

Oorzaak: Een afsluitende komma na het laatste item in een array of object, wat volgens RFC 8259 strikt verboden is.

Herstel: Verwijder afsluitende komma's bij objecteigenschappen en array-items voordat u deze doorgeeft aan JSON.parse().

SyntaxError: Unexpected token ' in JSON.

Oorzaak: Strings of sleutels omsloten door enkele aanhalingstekens ('') in plaats van dubbele aanhalingstekens ("").

Herstel: Vervang alle strings en sleutels met enkele aanhalingstekens door standaard strings met dubbele aanhalingstekens.

Beveiligingsanalyse en aanvalsvectoren voor parsers

JSON is alleen tekst en veilig tegen directe code-uitvoering, maar het parsen van niet-vertrouwde JSON kan leiden tot Prototype Pollution, ReDoS of geheugenuitputting.

Bekende aanvalsvectoren

  • Prototype Pollution: sleutels met de naam '__proto__' of 'constructor' die Object.prototype wijzigen in JavaScript-applicaties.
  • Denial-of-serviceaanval door stackoverloop via diep geneste JSON-structuren (bijvoorbeeld 10.000 openingshaken).
  • Verlies van numerieke precisie: JavaScript-getallen groter dan 2^53 - 1 (9.007.199.254.740.991) verliezen stilletjes precisie.

Aanbevolen beveiligingspraktijken: Evalueer JSON nooit met eval(). Gebruik JSON.parse() en neutraliseer '__proto__'-eigenschappen in recursieve functies voor het samenvoegen van objecten.

Historische oorsprong en mijlpalen

2017RFC 8259 standaardiseert UTF-8 als de enige verplichte tekencodering voor JSON.
2013ECMA-404 definieert de JSON-syntaxis, die door veel programmeertalen en platforms wordt gebruikt.
2001Douglas Crockford specificeerde JSON om staatloze gegevensuitwisseling tussen browser en server mogelijk te maken.

Belangrijkste voordelen

  • Door mensen leesbare, zelfbeschrijvende en beknopte tekststructuur.
  • Ingebouwde ondersteuning voor native parsing in JavaScript-engines (JSON.parse) en elke belangrijke programmeertaal.
  • Strikte specificatie voorkomt willekeurige code-uitvoering.

Technische beperkingen

  • Geen ondersteuning voor opmerkingen, afsluitende komma's of circulaire objectreferenties.
  • Geen native binaire typen (binaire data moet base64-gecodeerd zijn, wat de grootte met 33% vergroot).
  • Inefficiënte serialisatie vergeleken met binaire formaten zoals Protocol Buffers of MessagePack.

Interessante technische weetjes

  • Douglas Crockford voegde de softwarelicentieclausule 'The Software shall be used for Good, not Evil' toe aan de originele JSMin JSON-tools.
  • JSON is een strikte subset van de JavaScript-syntaxis, maar tot ES2019 waren onbewerkte, niet-geëscapete U+2028- en U+2029-tekens geldig in JSON maar ongeldig in JavaScript-strings.
  • Douglas Crockford ontdekte dat vroege webbrowsers JSON direct konden evalueren naar objecten met behulp van de native eval() van JavaScript voordat speciale JSON.parse()-API's werden gestandaardiseerd in ECMAScript 5.

Veelgestelde technische vragen

Waarom staat JSON geen opmerkingen toe?

JSON sluit opmerkingen uit van de grammatica. Implementaties kunnen verschillen in hoe ze omgaan met extensies en applicatiespecifieke data, dus het formaat alleen garandeert geen onderlinge compatibiliteit.

Hoe slaat u 64-bits gehele getallen op in JSON zonder precisieverlies?

Het ingebouwde Number-type van JavaScript is een IEEE 754-getal met dubbele precisie en drijvende komma. Het ondersteunt alleen gehele getallen tot 2^53 - 1 nauwkeurig. 64-bits gehele getallen (zoals database-ID's of tijdstempels) moeten in JSON als tekenreeksen worden geserialiseerd (bijvoorbeeld '1234567890123456789').

Wat is het verschil tussen JSON en NDJSON / JSON Lines?

Standaard-JSON verpakt de volledige payload in één hoofdobject of -array, waardoor parsers de hele tekst moeten laden voordat ze deze evalueren. NDJSON (Newline Delimited JSON) scheidt afzonderlijke geldige JSON-records met regeleinden (\n), wat geheugenefficiënte streaming regel voor regel van enorme datasets van meerdere gigabytes mogelijk maakt.

Gerelateerde conversieparen voor JSON