Utilia

JSONPath-tester

Test JSONPath-expressies op je eigen JSON in de browser. Filters, slices, recursief zoeken, paden en JSON Pointers, met kant-en-klare voorbeelden.

Zo test je een JSONPath-expressie

  1. Plak je JSON in JSON-gegevens, of klik op Voorbeeldgegevens laden om het klassieke boekwinkelvoorbeeld te gebruiken.
  2. Typ een expressie in JSONPath-expressie, of kies er een uit Voorbeelden.
  3. Het resultaat wordt bijgewerkt terwijl je typt; Query uitvoeren voert hem opnieuw uit. De statusregel geeft het aantal overeenkomsten.
  4. Wissel met Tonen tussen Waarden, Paden, JSON Pointers en Paden en waarden, en kopieer dan het resultaat.

JSONPath-syntaxis in het kort

Syntaxis Betekenis Voorbeeld
$ de root van het document $
.name of ['name'] een kind $.store.bicycle
* elk kind $.store.*
.. recursief afdalen, op elke diepte $..author
[n] array-index, vanaf 0 $..book[2]
[start:end:step] slice; negatieve getallen tellen vanaf het eind $..book[-1:]
[a,b] unie $..book[0,1]
[?(expr)] filter $..book[?(@.price < 10)]
^ de ouder van elke overeenkomst $..book[?(@.price > 20)]^
~ de eigenschapsnaam in plaats van de waarde $.store.*~

Resultaten komen in de volgorde van het document. Paden geeft genormaliseerde paden zoals $['store']['book'][0]['title'], en JSON Pointers geeft de RFC 6901-vorm /store/book/0/title, handig voor JSON Patch of voor de foutpaden van JSON Schema-validators.

Filterexpressies: wat wordt ondersteund

Filters worden geëvalueerd met jsonpath-plus in safe mode: de expressie wordt geparsed en geïnterpreteerd door een kleine evaluator, en nooit doorgegeven aan eval of new Function. Binnen [?( … )] kun je gebruiken:

  • @ voor het huidige item, @.field en @['field'] voor de leden ervan, @root voor het hele document ($ is binnen een filter niet beschikbaar);
  • vergelijkingen ==, !=, ===, !==, <, <=, >, >=;
  • logica &&, ||, !, rekenkunde + - * / % en de ternaire operator a ? b : c;
  • literals voor strings, getallen, true, false, null en reguliere expressies;
  • methoden van de waarden zelf, bijvoorbeeld @.title.startsWith('S'), @.tags.includes('new') of @.title.match(/lord/i);
  • @property (de sleutel of index van het huidige item), @parent en @path (het genormaliseerde pad), in de stijl van jsonpath-plus.

Toegang tot constructor, __proto__ en de Function-constructor is geblokkeerd. Mislukt een filter op één item, bijvoorbeeld @.isbn.startsWith('0') op een boek zonder isbn, dan komt dat item gewoon niet overeen; een syntaxfout in de expressie wordt wel gemeld. Filters in de stijl van RFC 9535, [?@.price < 10] zonder haakjes, worden geaccepteerd en gelezen als [?(@.price < 10)]. Functies uit RFC 9535 zoals length(), count(), match() en search() zijn niet beschikbaar: gebruik in plaats daarvan JavaScript-methoden zoals @.name.length.

Typeselectors van jsonpath-plus werken ook aan het eind van een pad: $..*@number() geeft elk getal terug, en @string(), @boolean(), @array(), @object(), @null() en @integer() doen hetzelfde voor andere types.

Veelgestelde vragen

Wordt mijn JSON naar een server gestuurd?

Nee. Parsen en evalueren gebeuren in je browser, en je gegevens verlaten je computer nooit.

Waarom geeft mijn filter niets terug?

Controleer of het pad voor het filter een array of object selecteert: $.store.book[?(@.price < 10)] filtert de boeken, terwijl $.store[?(@.price < 10)] naar book en bicycle kijkt. Een eigenschap die in een item ontbreekt is undefined, dus vergelijkingen ermee zijn onwaar.

Wat is het verschil tussen `==` en `===`?

Net als in JavaScript zet == types om ("10" == 10 is waar), terwijl === type en waarde vergelijkt.

Waarom is de uitvoer beperkt?

Alleen de eerste 10.000 overeenkomsten worden in het resultaat geschreven, zodat de pagina vlot blijft reageren; de statusregel geeft het volledige aantal.

Is JSONPath gestandaardiseerd?

Ja, sinds 2024, in RFC 9535. Implementaties verschillen nog steeds, vooral bij filters; deze tool volgt jsonpath-plus, de syntaxis van het oorspronkelijke JSONPath van Stefan Goessner.