Skip to content

Gratis JSONPath-tester — evalueer queries online

Test JSONPath-expressies direct tegen elke JSON. RFC 9535-standaardengine plus klassieke Goessner-modus, weergaven Waarden / Paden / Beide, genormaliseerde paden, geen eval. 100% privé, draait in je browser, geen upload.

Geen tracking Draait in je browser Gratis
Alle evaluatie draait lokaal in je browser. Je JSON en expressie verlaten nooit dit apparaat. Geen eval, geen upload.
Engine
 
JSONPath-spiekblad
$Root-element
@Huidig element (in filters)
.nameKindlid
..nameRecursieve afdaling
[*]Alle elementen / leden
[0]Array-index
[0:2]Array-slice [start:end:step]
[a,b]Unie van namen / indexen
[?(@.k>1)]Filterexpressie
length()RFC 9535-functie: length / count / match / search / value
Beoordeeld op getrouwheid aan de RFC 9535-grammatica, correctheid van genormaliseerde paden, semantische pariteit van de dubbele engine op veelvoorkomende paden en gedocumenteerde divergentie in de randgevallen, no-eval-veiligheid (het afsluiten van CVE-2024-21534 en CVE-2025-1302) en toegankelijkheid (ARIA-rollen, radiogroup-engine-knop, schermlezeraankondigingen van resultaten, LTR-JSON-verwerking onder RTL-layouts). — Go Tools Data Tooling Team · Jun 13, 2026

Wat is een JSONPath-tester?

Een JSONPath-tester is een tool waarmee je een JSONPath-expressie schrijft, een JSON-document plakt en precies ziet welke knooppunten de expressie selecteert — zowel de getroffen waarden als hun precieze locaties — zonder code te schrijven of een script uit te voeren. Voor ontwikkelaars verkort het de cyclus van minuten naar milliseconden: pas het pad aan, zie het resultaat veranderen en lever de query met vertrouwen op.

JSONPath is een querytaal voor JSON, het JSON-equivalent van XPath voor XML. Een expressie is opgebouwd uit een klein alfabet van selectors. $ is de root van het document. Een punt of een paar haken stapt in een kind: $.store of $['store']. De dubbele punt .. is recursieve afdaling — het doorzoekt elk niveau van de boom. De wildcard * selecteert alle elementen of leden. Haken dragen array-indexen ([0]), slices ([start:end:step]), unies ([a,b]) en filterexpressies ([?(@.price < 10)], waarbij @ het geteste element is). Met die onderdelen kun je één veld uit een diep geneste API-antwoord halen, waarden in tests asserteren, datatransformaties aansturen in systemen zoals Kubernetes, AWS Step Functions en Azure Logic Apps, of gestructureerde data extraheren uit onregelmatige JSON — allemaal zonder imperatieve doorloopcode. JSONPath is ook berucht inconsistent tussen implementaties, wat precies het probleem is dat een goede tester blootlegt voordat het de productie bereikt.

Deze tester levert twee engines. De standaard is een RFC 9535-engine: RFC 9535 is de formele JSONPath-specificatie van de IETF uit februari 2024, de eerste keer dat de taal precies werd gestandaardiseerd na vijftien jaar van uiteenlopende implementaties. Het definieert een exacte grammatica, het concept van genormaliseerde paden voor resultaten en vijf standaardfuncties — length(), count(), match(), search(), value(). Onze RFC 9535-engine is een implementatie zonder afhankelijkheden die geen eval gebruikt, dus hij parseert en interpreteert expressies met zijn eigen grammatica in plaats van ze naar JavaScript te compileren. De tweede engine is Klassiek (Goessner), het feitelijke dialect uit 2007 dat de meeste oudere online tools en bibliotheken implementeren; schakel ernaartoe om resultaten van een tool zoals jsonpath.com te reproduceren of om een expressie uit verouderde code uit te voeren. De twee dialecten zijn het eens over veelvoorkomende paden maar lopen uiteen in de randgevallen — witruimte en aanhalingstekens in filters, de volgorde van unies, hoe ontbrekende leden vergeleken worden en welke functies bestaan — dus tussen beide kunnen wisselen op één plek is de snelste manier om te diagnosticeren waarom een expressie zich anders gedraagt dan je verwachtte.

Wat de tester naast ruwe waarden blootlegt: het resultaat van een JSONPath-query is een knooppuntenlijst, en dit tool kan die op drie manieren tonen. De weergave Waarden rendert de getroffen knooppunten als een JSON-array, precies wat je in code zou gebruiken. De weergave Paden rendert het genormaliseerde pad van elke treffer — een canonieke, met haken en aanhalingstekens genoteerde locatie zoals $['store']['book'][0]['title'] die uniek identificeert waar in het document de waarde zich bevindt, ongeacht hoe de expressie was geschreven. Twee expressies die hetzelfde knooppunt selecteren, leveren hetzelfde genormaliseerde pad op, wat de weergave Paden van onschatbare waarde maakt voor debuggen. De weergave Beide toont waarden en paden naast elkaar. Een statistiekregel rapporteert hoeveel knooppunten overeenkwamen.

Beveiliging is hier een eersteklas zorg. Veel online JSONPath-evaluatoren draaien op een server, of bevatten een bibliotheek die filterpredicaten evalueert met JavaScript eval — het ontwerp dat de kwetsbaarheden voor externe code-uitvoering produceerde die worden bijgehouden als CVE-2024-21534 en CVE-2025-1302 in veelgebruikte JSONPath-pakketten. Dit tool gebruikt helemaal geen eval. De RFC 9535-engine heeft geen eval-pad, en de Klassieke engine is gebouwd op een gepatchte, vastgezette release van jsonpath-plus met eval expliciet uitgeschakeld. Dat sluit de RCE-klasse van bugs af en laat het tool draaien onder een strikt Content-Security-Policy dat unsafe-eval verbiedt. Elke evaluatie is lokaal: je JSON en je expressie verlaten nooit de pagina, worden nooit gelogd en worden nooit op schijf opgeslagen — alleen je engine- en weergavevoorkeuren blijven behouden in localStorage. Dat maakt het tool veilig voor bedrijfseigen API-payloads, geredigeerde logs, interne configuratie en alle data met een schema dat je niet in een serverafhankelijke dienst zou plakken.

Als JSON-bewerking je taak is, combineer dit dan met de andere JSON-tools op de site: formatteer en print je invoer netjes met de JSON Formatter, vergelijk twee documenten met de JSON Diff, controleer een payload tegen een schema met de JSON Schema Validator, of zet een voorbeeldantwoord om in getypeerde interfaces met JSON to TypeScript.

// The expression you build in this tester maps straight onto the
// RFC 9535 reference library used under the hood.
import { query, paths } from 'jsonpath-rfc9535';

const document = {
  store: {
    book: [
      { title: 'Sayings of the Century', author: 'Nigel Rees', price: 8.95 },
      { title: 'Sword of Honour', author: 'Evelyn Waugh', price: 12.99 },
      { title: 'Moby Dick', author: 'Herman Melville', price: 8.99 },
      { title: 'The Lord of the Rings', author: 'J. R. R. Tolkien', price: 22.99 }
    ]
  }
};

// Values: query(document, path) returns the matched values directly.
const titles = query(document, '$.store.book[*].title');
// → ['Sayings of the Century', 'Sword of Honour', 'Moby Dick', 'The Lord of the Rings']

// Filter: books cheaper than 10.
const cheap = query(document, '$.store.book[?(@.price < 10)].title');
// → ['Sayings of the Century', 'Moby Dick']

// Normalized paths: paths(document, path) returns where each match lives.
const authorPaths = paths(document, '$..author');
// → ["$['store']['book'][0]['author']", "$['store']['book'][1]['author']", ...]

// RFC 9535 functions like length() are used INSIDE filters, not as a segment.
const longTitles = query(document, '$.store.book[?length(@.title) > 15]');
// → the two books whose title is longer than 15 characters

Belangrijkste functies

RFC 9535-standaardengine (geen eval)

De standaardengine implementeert RFC 9535, de formele JSONPath-specificatie van de IETF uit 2024 — exacte grammatica, genormaliseerde paden en de vijf standaardfuncties. Hij is zonder afhankelijkheden en gebruikt geen eval, dus hij parseert en interpreteert expressies met zijn eigen grammatica in plaats van ze naar JavaScript te compileren. Hij draait onder een strikt Content-Security-Policy.

Compatibiliteitsmodus Klassiek (Goessner)

Eén knop schakelt naar een Goessner-compatibele engine (gebouwd op jsonpath-plus, geconstrueerd met eval uitgeschakeld) zodat expressies uit oudere tools zoals jsonpath.com zich gedragen zoals je ze daar zag. Wissel tussen RFC 9535 en Klassiek om resultaten te vergelijken en te diagnosticeren waarom een pad anders matcht tussen dialecten.

Drie resultaatweergaven: Waarden, Paden, Beide

Waarden rendert getroffen knooppunten als een JSON-array, precies wat je in code gebruikt. Paden rendert het genormaliseerde pad van elke treffer zoals $['store']['book'][0]['title']. Beide toont ze naast elkaar zodat je elke waarde aan zijn precieze locatie kunt koppelen. De actieve weergave blijft tussen sessies behouden.

Genormaliseerde paden voor elke treffer

Elk resultaat draagt zijn canonieke, met haken en aanhalingstekens genoteerde genormaliseerde pad — de RFC 9535-manier om de locatie van een knooppunt uniek te identificeren, ongeacht hoe de expressie was geschreven. Twee expressies die hetzelfde knooppunt raken, leveren hetzelfde genormaliseerde pad op, wat het debuggen van dubbelzinnige queries eenvoudig maakt.

Volledige selectorondersteuning

Root $, huidig element @, kind .name, recursieve afdaling ..name, wildcard [*], array-index [0], slice [start:end:step], unie [a,b] en filterexpressies [?()] met vergelijkings- en logische operatoren. Een ingebouwd spiekblad documenteert elke selector zodat je nooit de pagina hoeft te verlaten om er een op te zoeken.

RFC 9535-functie-uitbreidingen

Roep length(), count(), match(), search() en value() aan binnen expressies — tel de elementen van een array, test een string tegen een I-Regexp-patroon, of filter op de grootte van een geneste lijst. Deze standaardfuncties zijn beschikbaar in de standaardengine; het tool zegt je van engine te wisselen als je ze in de Klassieke modus aanroept.

Formatteren, uploaden en voorbeelden

JSON formatteren print je invoer netjes zodat de structuur leesbaar is voordat je een query uitvoert. Uploaden leest een .json- of .txt-bestand volledig in de browser — het wordt nooit ergens heen gestuurd. De keuzelijst Voorbeelden laadt betrouwbare startexpressies tegen voorbeelddata zodat je de engine ziet werken voordat je een pad aanpast.

Permalinks delen (geen upload)

Link kopiëren codeert de JSON, expressie, engine en weergave in de URL-hash. Browsers verzenden URL-fragmenten nooit in verzoeken, dus een gedeelde link reproduceert je volledige status op de machine van de ontvanger zonder de servers van go-tools.org aan te raken. Zelfstandig en auditvriendelijk voor gezamenlijk debuggen.

100% privé, alleen in de browser

Je JSON en je expressie verlaten nooit je apparaat. Geen netwerkverzoeken, geen logging, geen analyse van wat je typt — verifieer in DevTools → Netwerk. Alleen de engine- en weergavevoorkeuren blijven behouden in localStorage. Veilig voor bedrijfseigen payloads, geredigeerde logs en alle data die je niet in jsonpath.com zou plakken.

Uitgewerkte voorbeelden

Selecteer elke boektitel uit een boekhandeldocument

$.store.book[*].title
["Sayings of the Century", "Sword of Honour", "Moby Dick", "The Lord of the Rings"]

Plak de klassieke Goessner-boekhandel-JSON, typ de expressie en de weergave Waarden geeft een JSON-array met alle vier de titels terug. Schakel naar Paden om elk resultaat te zien als een genormaliseerd pad zoals $['store']['book'][0]['title']. De wildcard [*] doorloopt elk element van de book-array; .title projecteert één lid uit elk element.

Filter boeken goedkoper dan 10 met een filterexpressie

$.store.book[?(@.price < 10)].title
["Sayings of the Century", "Moby Dick"]

De filterselector [?()] behoudt alleen array-elementen waarvoor het predicaat waar is; @ is het huidige element. Tegen de boekhandelgegevens (prijzen 8.95, 12.99, 8.99, 22.99) voldoen twee boeken. Beide engines accepteren deze vorm, maar let op: Klassiek (Goessner) schrijft hetzelfde filter als [?(@.price<10)] — schakel van engine als je een expressie uit een ouder tool hebt gekopieerd.

Doorloop de hele boom met recursieve afdaling

$..author
["Nigel Rees", "Evelyn Waugh", "Herman Melville", "J. R. R. Tolkien"]

De operator .. daalt af in elk niveau van het document en verzamelt elk author-lid waar het ook voorkomt, ongeacht de nestingdiepte. Recursieve afdaling is de snelste manier om één veld uit een diep geneste of onregelmatige structuur te halen zonder het volledige pad uit te schrijven.

Snijd een array met [start:end:step]

$.store.book[0:2].title
["Sayings of the Century", "Sword of Honour"]

Array-slices volgen dezelfde half-open conventie [start:end] als Python en JavaScript: index 0 tot maar niet inclusief index 2 geeft de eerste twee boeken terug. Voeg een derde veld toe voor een stap — $.store.book[::2] neemt elk tweede element. De eindgrens is exclusief, een veelvoorkomende off-by-one-valkuil die de weergave Paden duidelijk maakt.

Filter op titellengte met de RFC 9535-functie length()

$.store.book[?length(@.title) > 15]
[{"title": "Sayings of the Century", "author": "Nigel Rees", "price": 8.95}, {"title": "The Lord of the Rings", "author": "J. R. R. Tolkien", "price": 22.99}]

length() is een van de vijf RFC 9535-standaardfuncties en is alleen geldig binnen een filterexpressie [?...] — nooit als losstaand padsegment zoals $.store.book.length(), wat de RFC 9535-grammatica afwijst (die segmentvorm is een jsonpath-plus-uitbreiding, geen standaard-JSONPath). Hier behoudt het filter elk boek waarvan de titel meer dan 15 tekens telt; tegen de boekhandelgegevens worden de titels langer dan 15 tekens geselecteerd (bijvoorbeeld "Sayings of the Century" en "The Lord of the Rings"), terwijl kortere zoals "Moby Dick" en "Sword of Honour" worden uitgesloten. count(), match(), search() en value() worden eveneens binnen filters gebruikt. Deze functies zijn een RFC 9535-kenmerk — schakel naar de standaardengine (de standaard) om ze te gebruiken; de modus Klassiek (Goessner) implementeert ze niet.

Selecteer een unie van twee benoemde leden

$.store.book[0]['title','author']
["Sayings of the Century", "Nigel Rees"]

Een unieselector [a,b] verzamelt meerdere kinderen in één expressie. Hier haalt hij zowel de title als de author van het eerste boek op. Unies werken ook met array-indexen — [0,2] pakt het eerste en derde element. De weergave Beide koppelt elke waarde aan zijn genormaliseerde pad, zodat je precies ziet welk lid welk resultaat opleverde.

Hoe gebruik je de JSONPath-tester

  1. 1

    Plak of upload je JSON

    Sleep JSON in het invoervak, plak het, of klik op Uploaden om een .json- / .txt-bestand van schijf te laden. JSON formatteren springt het document opnieuw in. Ongeldige JSON wordt inline gemarkeerd met een parserbericht voordat je een query uitvoert.

  2. 2

    Kies een engine

    RFC 9535 (de IETF-standaard uit 2024, geen eval) is de standaard. Schakel naar Klassiek (Goessner) wanneer je een expressie uitvoert die je uit een ouder tool zoals jsonpath.com hebt gekopieerd, zodat de resultaten overeenkomen met wat je daar zag.

  3. 3

    Typ je JSONPath-expressie

    De leidende $ wordt voor je getoond. Begin met een kindpad zoals .store.book[*].title, een index zoals [0], een recursieve afdaling zoals ..author, of een filter zoals [?(@.price < 10)]. Resultaten worden live bijgewerkt terwijl je typt.

  4. 4

    Schakel de resultaatweergave

    Waarden toont een JSON-array van getroffen waarden. Paden toont het genormaliseerde pad van elke treffer zoals $['store']['book'][0]['title']. Beide toont ze naast elkaar zodat je elke waarde aan zijn exacte locatie in het document kunt koppelen.

  5. 5

    Kopieer het resultaat of deel een permalink

    Resultaat kopiëren plaatst de uitvoer op je klembord. Link kopiëren codeert de JSON, expressie, engine en weergave in een URL-hash (geen upload) zodat een collega de exacte query lokaal op zijn eigen machine kan reproduceren.

Veelvoorkomende JSONPath-fouten

De leidende $ root vergeten

Elke JSONPath-expressie begint bij de root, geschreven als $. Die weglaten (of het pad schrijven alsof $ impliciet is) zorgt ervoor dat de meeste engines de expressie afwijzen. De tester toont de $ voor je, dus begin je invoer met de volgende selector — een punt, een paar haken of een recursieve afdaling.

✗ Fout
store.book[*].title  →  invalid (no root)
✓ Correct
$.store.book[*].title  →  selects every title

Off-by-one-slice — de eindindex inbegrepen verwacht

Slices zijn half-open: [start:end] loopt tot maar niet inclusief end. [0:2] geeft twee elementen terug (indexen 0 en 1), niet drie. Om het laatste element op index in te sluiten, gebruik [start:] of duw de eindgrens er één voorbij.

✗ Fout
$.store.book[0:2]  →  first TWO books, not three
✓ Correct
$.store.book[0:3]  →  first three books (indices 0,1,2)

Een Klassieke expressie gebruikt in de RFC 9535-engine (of andersom)

Een expressie gekopieerd van jsonpath.com of jsonpath-plus kan onder RFC 9535 anders parseren of matchen vanwege filter-, unie- en functieverschillen. Als de resultaten verkeerd lijken, schakel de engine-knop dan om naar het dialect waarvoor de expressie is geschreven.

✗ Fout
Classic filter run under RFC 9535  →  parse error or unexpected nodes
✓ Correct
Switch engine to Classic (Goessner)  →  reproduces the original result

Een RFC 9535-functie aangeroepen als losstaand segment

length(), count(), match(), search() en value() zijn RFC 9535-functie-uitbreidingen die alleen geldig zijn binnen een filter [?...]. Een losstaande segmentaanroep zoals $.store.book.length() wordt afgewezen door de RFC 9535-grammatica (het is een jsonpath-plus-uitbreiding, geen standaard). Roep de functie binnen een filter aan en gebruik de standaard RFC 9535-engine — de engine Klassiek (Goessner) implementeert deze functies niet.

✗ Fout
$.store.book.length()  →  parse error (not a valid RFC 9535 segment)
✓ Correct
$.store.book[?length(@.title) > 15]  →  books with a title over 15 chars

De @ in een filterexpressie vergeten

Binnen een filter [?()] is het huidige element @, niet $. $.price schrijven verwijst terug naar de document-root in plaats van naar het geteste element, dus het filter selecteert niets of alles. Gebruik @ om leden van het gefilterde element te adresseren.

✗ Fout
$.store.book[?($.price < 10)]  →  wrong scope
✓ Correct
$.store.book[?(@.price < 10)]  →  books under 10

Een ledennaam met de verkeerde syntaxis geciteerd

Haaknotatie vereist aanhalingstekens rond stringsleutels: $['store'] of $.store werken beide, maar $[store] (ongeciteerd tussen haken) is een index-/identifierfout. Gebruik aanhalingstekens tussen haken voor elke sleutel met spaties, punten of speciale tekens: $['first name'].

✗ Fout
$[store][book]  →  invalid bracket selectors
✓ Correct
$['store']['book']  →  same as $.store.book

Verwacht dat recursieve afdaling op het eerste niveau stopt

$..author stopt niet bovenaan — het verzamelt elk author-lid op elke diepte. Als je alleen directe kinderen wilt, schrijf het pad dan uit. Recursieve afdaling over een groot document kan veel meer knooppunten teruggeven dan bedoeld.

✗ Fout
$..price  →  every price anywhere in the tree
✓ Correct
$.store.book[*].price  →  only book prices

Wie gebruikt dit tool

Extraheer velden uit een API-antwoord
Haal request-ID's, geneste resource-attributen of een lijst met namen uit een JSON-payload zonder doorloopcode te schrijven. Bouw het pad hier tegen een voorbeeldantwoord, bevestig dat het precies de knooppunten teruggeeft die je wilt in de weergave Waarden, en plak vervolgens de gevalideerde expressie in je applicatie of test.
Schrijf asserties voor integratietests
Veel testframeworks en contracttesttools (REST Assured, Karate, Postman) gebruiken JSONPath om op responsbodies te asserteren. Stel het assertiepad hier op, verifieer dat het het juiste knooppunt selecteert tegen een echt antwoord, en kopieer het naar je test — zo vang je een verkeerd pad op voordat de suite rood wordt.
Configureer datatransformaties in pijplijnen
Kubernetes, AWS Step Functions, Azure Logic Apps en veel ETL-tools accepteren JSONPath om velden in event-payloads te adresseren. Prototypeer het exacte pad hier tegen een representatief event, bevestig dat het resolveert, en plaats het in je pijplijnconfiguratie met de zekerheid dat het wijst waar je bedoelt.
Reproduceer een jsonpath.com-resultaat privé
Heb je een expressie van een serverafhankelijke evaluator maar kun je je data niet in een externe site plakken? Schakel naar de modus Klassiek (Goessner), laad je JSON en reproduceer hetzelfde resultaat lokaal — geen payload verlaat ooit je browser, dus bedrijfseigen data blijft op je machine.
Migreer verouderde expressies naar RFC 9535
Overstappen naar een systeem dat RFC 9535-conformiteit adverteert? Voer een verouderde expressie uit in de Klassieke modus, schakel dan naar de RFC 9535-engine om te zien of die nog parseert en dezelfde knooppunten matcht. De vergelijking met dubbele engine wijst de filter-, unie- en functieverschillen aan die je anders in productie zou tegenkomen.
Debug waarom een pad de verkeerde knooppunten teruggeeft
Een pad dat te veel of te weinig selecteert, is moeilijk te beredeneren op basis van de waarden alleen. Schakel naar de weergave Paden om de genormaliseerde locatie van elke treffer te zien — de exacte array-index, de exacte ledenketen — en de off-by-one-slice of verdwaalde recursieve afdaling wordt onmiddellijk duidelijk.
Onderwijs of beoordeel JSONPath
Open een werkende expressie tegen voorbeelddata en loop er selector voor selector doorheen, terwijl je wisselt tussen Waarden en Paden zodat de lerende zowel ziet wat wordt geselecteerd als waar het zich bevindt. Het spiekblad en de uitgewerkte voorbeelden bieden een gestructureerde referentie voor codereview of onboarding.

Engine- en algoritmenotities

RFC 9535-engine (jsonpath-rfc9535, zonder afhankelijkheden)
De standaardengine implementeert de IETF RFC 9535-grammatica direct: hij tokeniseert en parseert de expressie tot een abstracte syntaxisboom en interpreteert die tegen het document. Er is nergens in het pad eval of de Function-constructor, dus hij is immuun voor de klasse van eval-injectiebugs en draait onder een strikt Content-Security-Policy.
Klassieke engine (jsonpath-plus, eval uitgeschakeld)
De engine Klassiek (Goessner) is jsonpath-plus, vastgezet op een gepatchte release (>= 10.4.0) en geconstrueerd met de eval-optie expliciet op false. Dat behoudt de compatibiliteit met het Goessner-dialect en sluit tegelijk de vectoren voor externe code-uitvoering af die worden bijgehouden als CVE-2024-21534 en CVE-2025-1302, die het standaard op eval gebaseerde filterpad van de bibliotheek troffen.
Generatie van genormaliseerde paden
Elke treffer wordt gerapporteerd met zijn genormaliseerde RFC 9535-pad — een canonieke vorm met enkele aanhalingstekens in haaknotatie ($['store']['book'][0]['title']) met array-indexen als kale gehele getallen. Genormaliseerde paden zijn stabiel en uniek per knooppunt, dus gelijkwaardige expressies leveren identieke paden op, waarop de weergaven Paden en Beide vertrouwen voor ondubbelzinnige resultaatidentificatie.
Lui geladen engine-chunks
Beide engines worden als afzonderlijke JavaScript-chunks geladen, alleen wanneer ze voor het eerst worden geselecteerd, zodat de initiële pagina licht blijft en de engine die je niet gebruikt nooit wordt gedownload. Van engine wisselen herevalueert de huidige expressie onmiddellijk tegen het huidige document, zonder pagina-herlaad.
Lokaal bestanden lezen en JSON formatteren
De knop Uploaden gebruikt de browser-FileReader-API om een .json- of .txt-bestand volledig aan de clientzijde in de invoer te lezen — het bestand wordt nooit verzonden. JSON formatteren parseert en serialiseert de invoer opnieuw met inspringing van twee spaties en brengt parsefouten inline naar voren zodat misvormde JSON wordt opgevangen vóór evaluatie.
Permalinks via URL-hash (nooit verzonden)
De deelstatus wordt gecodeerd in het location.hash-fragment, dat de JSON, de expressie, de actieve engine en de resultaatweergave draagt. Browsers nemen het fragment nooit op in HTTP-verzoeken, dus de servers van go-tools.org ontvangen nul data wanneer een permalink wordt geopend; hydratatie gebeurt volledig op het apparaat van de ontvanger.

JSONPath best practices

Kies de engine die bij je doel past
Als je downstream-systeem RFC 9535-conformiteit adverteert, schrijf en valideer dan tegen de RFC 9535-engine. Als je een expressie van een ouder tool of bibliotheek reproduceert of onderhoudt, gebruik dan Klassiek (Goessner). Valideren tegen het verkeerde dialect is de meest voorkomende reden dat een pad dat in de tester werkte, in productie faalt.
Verifieer met de weergave Paden, niet alleen Waarden
De weergave Waarden vertelt je wat overeenkwam; de weergave Paden vertelt je waar. Wanneer een query de juist ogende waarden teruggeeft, kan hij ze toch uit de verkeerde locatie selecteren — een verdwaalde recursieve afdaling of een te brede wildcard. Controleer de genormaliseerde paden om te bevestigen dat de expressie precies de knooppunten raakt die je bedoelt.
Let op het exclusieve einde van een slice
[0:2] selecteert indexen 0 en 1, niet 0 tot en met 2 — de eindgrens is exclusief, net als in Python en JavaScript. Off-by-one-slicefouten zijn de meest voorkomende JSONPath-bug. Gebruik de weergave Paden om de exacte index van elk geselecteerd element te lezen en de grens te bevestigen voordat je oplevert.
Verkies een expliciet pad boven recursieve afdaling waar mogelijk
$..price is handig maar matcht elke prijs overal in het document, inclusief die je niet bedoelde. Wanneer je de structuur kent, schrijf het pad dan uit ($.store.book[*].price) zodat de query precies en voorspelbaar blijft naarmate de data groeit. Reserveer .. voor werkelijk onregelmatige of onbekende vormen.
Houd witruimte en aanhalingstekens consistent in filters
RFC 9535 volgt zijn grammatica exact voor filterexpressies, terwijl het klassieke dialect losser is. Schrijf filters netjes — citeer stringliterals met enkele aanhalingstekens ('fiction'), houd operatoren gespatieerd en vermijd te leunen op soepel parsen — zodat dezelfde expressie op dezelfde manier evalueert ongeacht welke engine of bibliotheek uiteindelijk draait.

Veelgestelde vragen

Worden mijn JSON of JSONPath-expressie naar jullie server verstuurd?
Nee. Elke evaluatie draait in JavaScript binnen je browser. Je JSON-document en je JSONPath-expressie worden niet geüpload, niet gelogd, niet op schijf opgeslagen en niet naar een derde partij verstuurd. Alleen je UI-voorkeuren — de actieve engine (RFC 9535 of Klassiek) en de resultaatweergave (Waarden / Paden / Beide) — worden in localStorage bewaard zodat de pagina ze bij je volgende bezoek onthoudt; de JSON en de expressie zelf worden nooit bewaard. Je kunt dit verifiëren door DevTools → Netwerk te openen: typen in een van beide velden veroorzaakt nul verzoeken. Dat maakt dit tool veilig voor bedrijfseigen API-payloads, geredigeerde logvoorbeelden, interne configuratie en alles wat je niet in een serverafhankelijke evaluator zoals jsonpath.com zou plakken.
Wat is JSONPath en waarvoor wordt het gebruikt?
JSONPath is een querytaal voor JSON, op dezelfde manier als XPath een querytaal voor XML is. Je schrijft een padexpressie — bijvoorbeeld $.store.book[*].author — en de evaluator geeft elke waarde in het document terug die het pad selecteert. Het wordt gebruikt om specifieke velden uit API-antwoorden te halen, om waarden te asserteren in integratietests, om datatransformaties te configureren in tools zoals Jenkins, Kubernetes, AWS Step Functions en Azure Logic Apps, en om data te extraheren uit grote of onregelmatige JSON zonder imperatieve doorloopcode te schrijven. Een expressie is opgebouwd uit een as van selectors: $ (de root), . of [] (toegang tot kind), .. (recursieve afdaling), * (wildcard), [start:end:step] (array-slice), [a,b] (unie) en [?()] (filter). Deze tester evalueert de expressie live en toont zowel de getroffen waarden als hun genormaliseerde paden.
Wat is het verschil tussen RFC 9535 en de klassieke Goessner-syntaxis?
Klassiek JSONPath is de feitelijke syntaxis die Stefan Goessner in 2007 publiceerde. Het werd breed geïmplementeerd maar nooit formeel gestandaardiseerd, dus subtiele gedragingen — hoe filters worden geschreven, hoe unies en de root-functie werken, hoe afwezige waarden worden vergeleken — liepen uiteen tussen bibliotheken. RFC 9535, in februari 2024 gepubliceerd door de IETF, is de eerste formele specificatie van JSONPath. Het legt een precieze grammatica vast, definieert genormaliseerde paden voor resultaten en voegt standaardfuncties toe (length, count, match, search, value). De twee liggen dicht bij elkaar maar zijn niet identiek: RFC 9535 is strikter over witruimte en aanhalingstekens in filters, definieert vergelijkingssemantiek voor ontbrekende leden en wijst sommige losse constructies af die het klassieke dialect tolereerde. Dit tool gebruikt standaard de RFC 9535-engine (een implementatie zonder afhankelijkheden en zonder eval) en laat je overschakelen naar een Klassieke (Goessner) engine voor achterwaartse compatibiliteit.
Waarom geeft dezelfde expressie verschillende resultaten in de twee engines, en hoe gebruik ik een expressie die ik van jsonpath.com heb gekopieerd?
Omdat RFC 9535 en het klassieke Goessner-dialect in de randgevallen werkelijk verschillende regels hebben — witruimte en aanhalingstekens in filters, de volgorde van unies, hoe ontbrekende leden vergeleken worden en welke functies bestaan. Een expressie die voor de ene engine is geschreven, kan anders matchen (of niet parseren) in de andere. Als je een expressie hebt gekopieerd uit een ouder tool zoals jsonpath.com, jsonpath-plus of een Jayway-gebaseerde dienst, schakel dan de engine-knop bovenaan naar Klassiek (Goessner): die modus draait een Goessner-compatibele evaluator (gebouwd op jsonpath-plus, geconstrueerd met eval uitgeschakeld) en reproduceert het gedrag dat je in het brontool zag. Als je een nieuwe expressie schrijft of mikt op een systeem dat RFC 9535-conformiteit adverteert, houd dan de standaard RFC 9535-engine aan. Het spiekblad en de ingebouwde voorbeelden zijn zo geschreven dat ze in beide engines identiek evalueren, zodat je een betrouwbaar startpunt hebt.
Hoe werken filterexpressies [?()]?
Een filterselector behoudt alleen de array-elementen (of objectleden) waarvoor een predicaat waar is. Binnen het filter verwijst @ naar het huidige element dat wordt getest. $.store.book[?(@.price < 10)] geeft elk boek terug waarvan het price-lid kleiner is dan 10. Je kunt vergelijken met literals (@.isbn, @.category == 'fiction'), voorwaarden combineren met && en ||, testen op het bestaan van een lid (@.isbn selecteert elementen die überhaupt een isbn hebben) en in RFC 9535 de functie-uitbreidingen binnen het predicaat gebruiken (?(length(@.tags) > 2)). Vergelijkingsoperatoren zijn ==, !=, <, <=, >, >=. RFC 9535 is precies over types: een ontbrekend lid vergelijken met een waarde is welgedefinieerd en gooit geen fout. Het klassieke dialect is losser over witruimte, dus [?(@.price<10)] en [?(@.price < 10)] worden daar beide geaccepteerd; RFC 9535 volgt zijn grammatica exact.
Wat doet recursieve afdaling (..)?
De operator .. doorzoekt elk niveau van het document, niet alleen de directe kinderen. $..author verzamelt elk author-lid waar het ook voorkomt — binnen het object op het hoogste niveau, binnen arrays, binnen geneste objecten, op elke diepte. Het is de snelste manier om een veld te extraheren uit een diep geneste of onregelmatig gevormde structuur wanneer je het volledige pad niet wilt (of kunt) uitschrijven. Je kunt .. laten volgen door elke selector: $..book[*] vindt elk element van elke book-array overal in de boom, $..* somt elke waarde in het document op en $..['price'] verzamelt alle price-leden. Recursieve afdaling kan veel matchen — schakel naar de weergave Paden om precies te zien waar elk resultaat vandaan kwam via zijn genormaliseerde pad.
Wat zijn de RFC 9535-functies length(), count(), match(), search() en value()?
RFC 9535 definieert vijf standaard functie-uitbreidingen, en de kernregel is dat ze alleen aanroepbaar zijn binnen een filterexpressie [?...] — nooit als losstaand padsegment. $.store.book.length() schrijven is geen geldig RFC 9535 en de standaardgrammatica wijst het af (die segment-aanroepvorm is een jsonpath-plus-uitbreiding, geen onderdeel van de spec). length() geeft de lengte terug van een string, array of object, dus je gebruikt het om op grootte te filteren: $.store.book[?length(@.title) > 15] behoudt boeken waarvan de titel langer is dan 15 tekens. count() geeft het aantal knooppunten terug dat een knooppuntenlijst bevat, ook binnen een filter: $.store.book[?(count(@.authors) > 1)]. match() test of een string overeenkomt met een reguliere expressie tegen de hele waarde, en search() test op een match ergens binnen de string — beide nemen een I-Regexp-patroon. value() converteert een knooppuntenlijst van één knooppunt naar zijn waarde zodat die in een vergelijking kan worden gebruikt. Deze functies maken deel uit van de RFC 9535-standaard, dus ze zijn beschikbaar in de standaardengine; de engine Klassiek (Goessner) implementeert ze niet. Als een op functies gebaseerde expressie faalt, controleer dan of je hem binnen een filter aanroept en of de engine-knop op RFC 9535 staat.
Hoe werken array-slices [start:end:step]?
Slices gebruiken dezelfde half-open conventie als Python en JavaScript: [start:end] selecteert vanaf index start tot maar niet inclusief index end, dus [0:2] geeft de eerste twee elementen terug (indexen 0 en 1). Laat een grens weg om tot de rand te lopen — [2:] vanaf index 2 verder, [:3] voor de eerste drie. Een negatieve index telt vanaf het einde: [-1:] selecteert het laatste element. Het optionele derde veld is een stap — [::2] neemt elk tweede element, [::-1] keert om (in engines die negatieve stappen ondersteunen). De exclusieve eindgrens is de meest voorkomende slice-bug; de weergave Paden toont de exacte index van elk geselecteerd element zodat je de grens in één oogopslag kunt bevestigen.
Wat is een unieselector en hoe selecteer ik meerdere sleutels tegelijk?
Een unieselector somt meerdere namen of indexen op binnen één paar haken en verzamelt ze allemaal: $['title','author'] selecteert beide leden uit een object, en $.store.book[0,2] selecteert het eerste en derde element van de book-array. Je kunt het mengen met andere selectors — $.store.book[*]['title','price'] haalt de title en price van elk boek op. Unies zijn handig wanneer je een vaste projectie van enkele velden wilt in plaats van een heel object of een wildcard. De weergave Beide is de duidelijkste manier om een unieresultaat te lezen omdat het elke geselecteerde waarde koppelt aan zijn genormaliseerde pad, zodat je kunt zien welke naam of index elke vermelding opleverde.
Kan ik een JSONPath-query en de bijbehorende JSON via een link delen?
Ja — en de link vereist geen serverronde. Klik op Link kopiëren in de actiebalk: de tester codeert de JSON, de expressie, de actieve engine en de resultaatweergave in de URL-hash. Iedereen die de link opent, hydrateert de pagina met dezelfde status, lokaal op hun eigen machine. Omdat de data in het hash-fragment leeft, wordt die nooit verzonden naar de server van go-tools.org — browsers sturen het fragment niet mee in HTTP-verzoeken — en verschijnt die nooit in onze toegangslogboeken. De linklengte groeit met de grootte van de JSON, dus deel voor grote documenten alleen de expressie en laat de ontvanger zijn eigen data plakken, of gebruik de knop Uploaden om een bestand lokaal te laden. Dit maakt permalinks veilig voor gezamenlijk debuggen zonder de payload aan een backend bloot te stellen.
Is er een maximale JSON-grootte?
Evaluatie wordt begrensd door het geheugen van je browser in plaats van door een harde limiet, maar het praktische optimum is documenten tot enkele megabytes — comfortabel groter dan vrijwel elk afzonderlijk API-antwoord. Zeer grote arrays met brede selectors (een recursieve wildcard $..* over tienduizenden knooppunten) leveren een grote resultaatset op die langer duurt om te renderen; vernauw de expressie om de uitvoer leesbaar te houden. De knop Uploaden leest een .json- of .txt-bestand volledig in de browser (het wordt nooit ergens heen gestuurd), en JSON formatteren herindeelt de invoer zodat je de structuur kunt lezen voordat je een query uitvoert. Voor datapijplijnen van meerdere megabytes valideer je je expressie hier tegen een representatieve slice en draai je vervolgens hetzelfde pad in je applicatiecode of in een CLI-tool zoals jq.
Hoe verschilt dit van jsonpath.com en is het veilig — geen eval?
Vier verschillen. (1) Privacy: jsonpath.com en de meeste online evaluatoren draaien op een server of bevatten een bibliotheek die filters evalueert met JavaScript eval; dit tool draait volledig in je browser en gebruikt helemaal geen eval. De standaard RFC 9535-engine is een implementatie zonder afhankelijkheden zonder eval-pad, en de engine Klassiek (Goessner) is gebouwd op jsonpath-plus vastgezet op een gepatchte release met eval expliciet uitgeschakeld — waarmee de klasse van bugs voor externe code-uitvoering die wordt bijgehouden als CVE-2024-21534 en CVE-2025-1302 wordt afgesloten. Dat betekent ook dat het tool werkt onder een strikt Content-Security-Policy. (2) Standaarden: dit is een van de weinige online testers die een echte RFC 9535-engine biedt, niet alleen het verouderde Goessner-dialect. (3) Dubbele engine: je kunt schakelen tussen RFC 9535 en Klassiek om resultaten te vergelijken of om expressies uit oudere tools naast elkaar uit te voeren. (4) Talen: de interface is beschikbaar in 15 talen. Als je alleen snelle controles in de verouderde syntaxis nodig hebt, werkt jsonpath.com nog steeds; voor standaardconforme, privé evaluatie zonder eval is dit de veiligere keuze.
Wat tonen de weergaven Waarden, Paden en Beide?
Het resultaat van een JSONPath-query is een knooppuntenlijst — een verzameling knooppunten binnen je document. De weergave Waarden rendert die knooppunten als een JSON-array van de getroffen waarden, precies wat je in code zou gebruiken. De weergave Paden rendert in plaats daarvan het genormaliseerde pad van elke treffer — een canonieke, met haken en aanhalingstekens genoteerde locatie zoals $['store']['book'][0]['title'] die uniek identificeert waar in het document de waarde zich bevindt, ongeacht hoe je expressie was geschreven. Genormaliseerde paden zijn een RFC 9535-concept en zijn van onschatbare waarde voor debuggen: twee verschillende expressies die hetzelfde knooppunt selecteren, leveren hetzelfde genormaliseerde pad op. De weergave Beide toont de twee naast elkaar zodat je elke waarde in één oogopslag aan zijn locatie kunt koppelen. Je gekozen weergave blijft tussen sessies behouden via localStorage.
Werkt dit offline, en hoe zit het met een Content-Security-Policy?
Ja op beide punten. Omdat elke evaluatie in je browser draait zonder netwerkaanroepen, blijft het tool werken zodra de pagina is geladen, zelfs als je offline gaat. En omdat geen van beide engines eval of de Function-constructor gebruikt om filterexpressies te evalueren, draait het tool onder een strikt Content-Security-Policy dat unsafe-eval verbiedt — het beleid dat veel beveiligingsbewuste organisaties afdwingen en dat op eval gebaseerde JSONPath-bibliotheken breekt. De RFC 9535-engine parseert en interpreteert expressies met zijn eigen grammatica in plaats van ze naar JavaScript te compileren, en de Klassieke engine is geconfigureerd met eval uitgeschakeld. Als je JSONPath moet evalueren binnen een gehardende interne omgeving, is dit tool ontworpen om daar te draaien zonder beleidsuitzonderingen.

Gerelateerde tools

Alle tools bekijken →