🐛

Veelvoorkomende JSON-fouten en hoe je ze oplost

Een veldgids voor de JSON-fouten die je in het wild echt tegenkomt - wat ze betekenen, waar ze vandaan komen en hoe je ze snel oplost.

· 7min leestijd

Elke developer die met JSON werkt, leert de foutmeldingen uiteindelijk uit zijn hoofd. “Unexpected token in JSON at position 47” — we hebben daar allemaal om 3 uur ‘s nachts naar gestaard. De foutmeldingen zijn technisch correct maar zelden behulpzaam: de genoemde positie is bijna nooit waar de echte fout zit.

Dit is een veldgids voor de JSON-fouten die je in de praktijk echt ziet, wat ze werkelijk betekenen en hoe je elk snel oplost. Alle voorbeelden zijn getest tegen de standaard JSON.parse()-implementatie die elke browser en Node.js gebruikt.

1. “Unexpected token , in JSON”

Bijna altijd een trailing comma.

{
  "name": "Alice",
  "role": "admin",
}

De komma na "admin" is ongeldig. JSON staat geen trailing commas toe, anders dan JavaScript-objecten of Python-dicts.

Oplossing: verwijder de trailing comma. En let op: de parser wijst meestal naar de regel na de komma, niet naar de komma zelf. Zegt de fout “regel 5”, kijk dan eerst naar regel 4.

Bron: handmatige bewerkingen, of tools die JavaScript-stijl object-literals exporteren en JSON noemen.

2. “Unexpected end of JSON input”

Het bestand is afgeknot. Een sluitbracket of accolade ontbreekt.

{
  "users": [
    { "name": "Alice" },
    { "name": "Bob" }
  ]
 ontbrekende sluit-accolade voor het buitenste object

Oplossing: tel je brackets. De meeste editors tonen bracket matching — zet je cursor op de openende { en kijk waarmee hij paart.

Diagnose: check de bestandsgrootte. Verwachtte je 200 KB en kreeg je 180 KB, dan is het bestand afgeknot. Terug naar de bron.

Bron: mislukte HTTP-downloads, onvolledige writes van een crashend proces, bestandscorruptie.

3. “Unexpected token } in JSON”

Een extra sluit-accolade, of een ontbrekende komma voor een naburige key.

{
  "name": "Alice" ontbrekende komma hier
  "role": "admin"
}

Oplossing: voeg de ontbrekende komma toe. Of:

{ "name": "Alice" } } ← extra sluit-accolade

Oplossing: verwijder de extra accolade.

4. “Unexpected token u in JSON”

Letterlijk het karakter u verscheen waar een waarde werd verwacht. Vrijwel altijd is dit de string undefined, die geen geldige JSON is.

{ "role": undefined }

undefined is een JavaScript-waarde, geen JSON-waarde. JSON heeft alleen null.

Oplossing: vervang undefined door null, of laat de key helemaal weg.

5. “Unexpected token < in JSON”

Je “JSON” is eigenlijk HTML. De < is het begin van een HTML-tag.

<!DOCTYPE html>
<html>
  <head><title>500 Server Error</title>
  ...

Oplossing: check wat je server daadwerkelijk teruggeeft. console.log(response.text) voordat je parset. Zie je HTML, dan zit je probleem aan de serverkant — een foutpagina of een loginredirect in plaats van de verwachte JSON-response.

6. “Unexpected token ’ in JSON”

Enkele aanhalingstekens in plaats van dubbele.

{ 'name': 'Alice' }

JSON-strings moeten dubbele aanhalingstekens hebben. Strings met enkele aanhalingstekens zijn ongeldig, ook al werken ze in JavaScript en Python.

Oplossing: vervang alle enkele aanhalingstekens door dubbele. Als de strings letterlijke dubbele aanhalingstekens bevatten, escape die (\").

Bron: JavaScript object-literals plakken en JSON noemen; Python dict-output die niet via json.dumps() is geserialiseerd.

7. “Unexpected token n in JSON”

Vaak een letterlijke newline binnen een string.

{ "description": "hello
world" }

JSON-strings kunnen geen letterlijke newlines bevatten. Die moeten worden ge-escapet als \n.

Oplossing: escape newlines:

{ "description": "hello\nworld" }

Bron: handmatig JSON construeren uit multi-line input, of systemen die tekstvelden direct dumpen zonder te escapen.

8. “Unexpected number in JSON”

Een nummer in een ongeldig formaat. Veelvoorkomende gevallen:

  • +5 — leidend plusteken is niet toegestaan
  • 07 — leidende nul op integer is niet toegestaan
  • 1. — decimaalpunt zonder volgend cijfer
  • .5 — leidende punt zonder nul
  • Infinity, -Infinity, NaN — niet toegestaan

Oplossing: verwijder het leidende +, laat leidende nullen vallen, voeg ontbrekende nullen toe (1.1.0, .50.5), en vervang Infinity/NaN door null of een sentinel-string.

9. “Duplicate key ’…’ in JSON”

Een object heeft dezelfde key twee keer.

{
  "name": "Alice",
  "name": "Bob"
}

Standaard parsers accepteren dit technisch — ze nemen stilzwijgend de laatste waarde. Strikte parsers weigeren het. Als je parser duplicaten als fout markeert, doet hij je een plezier.

Oplossing: beslis welke waarde klopt en verwijder de andere. Altijd.

10. “Expected ’:’ after property name in JSON”

Je gebruikte = in plaats van :, of vergat de dubbele punt helemaal.

{ "name" = "Alice" } ← fout (= in plaats van :)
{ "name" "Alice" } ← fout (geen dubbele punt)

Bron: spiergeheugen van andere talen, bijv. = in YAML of TOML.

11. Ongeldige UTF-8 of BOM

Het bestand begint met een BOM (byte-order mark) of bevat ongeldige UTF-8-bytes. De BOM (U+FEFF) is een legacy Windows-bestandscodering-marker. JSON-parsers zouden hem technisch moeten weigeren, al tolereren veel hem stilzwijgend.

Oplossing: strip de BOM. Op macOS/Linux: tail -c +4 file.json > file-clean.json. Op Windows: sla het bestand op als “UTF-8 zonder BOM” in je editor.

Bron: Windows Notepad, Microsoft-producten die tekst exporteren, oudere CMS-exports.

12. “Circular structure”-fouten van JSON.stringify

Dit is een serialisatie-fout, geen parse-fout, maar hij komt vaak genoeg voor.

const obj = { a: 1 }
obj.self = obj
JSON.stringify(obj) // TypeError: Converting circular structure to JSON

Oplossing: geef geen zelf-refererende structuur aan stringify. Vlak de data af voor serialisatie, of gebruik een library als flatted of safe-stringify.

Bron: React-components, DOM-nodes, ORM-modellen met back-references.

Een debugging-workflow

Als je een JSON-parse-fout tegenkomt:

  1. Kopieer de problematische JSON in een formatter
  2. Klik op Format — als hij weigert, vertelt hij waar
  3. Kijk 2-3 regels boven de gemelde regel; de echte fout zit er vaak vlak voor
  4. Scan op de gebruikelijke verdachten — trailing comma, ontbrekende komma, enkel aanhalingsteken, niet-gesloten string
  5. Is het enorm, gebruik binaire zoek: verwijder de tweede helft van het document en probeer opnieuw. Geldig? Dan zit de fout in de verwijderde helft. Versmal verder.
  6. Check de bron — gaf je API daadwerkelijk JSON terug, of HTML/platte tekst?

Preventie

Een paar gewoonten die JSON-fouten voorkomen:

Valideer JSON altijd voor het committen van config-bestanden naar versiebeheer. Een pre-commit hook die jq empty file.json draait vangt de meeste problemen.

Gebruik een linter die JSON begrijpt en problemen meldt bij opslaan. Geef de voorkeur aan serialisatie-libraries (JSON.stringify, json.dumps) boven handmatig JSON-strings construeren — dat is waar trailing commas, unquoted keys en niet-ge-escapete strings vandaan komen.

Houd waarden consistent getypeerd: wissel niet af tussen "1" (string) en 1 (nummer) voor hetzelfde veld. Iemand downstream loopt er toch tegenaan.

De meeste fouten op deze lijst zijn in seconden vindbaar met onze JSON Formatter. Plak de kapotte JSON, klik op Format, lees de foutmelding. Alles draait in je browser, dus je kunt gevoelige config of API-responses debuggen zonder dat er iets je apparaat verlaat.