Utilia

Tester JSONPath

Testează expresii JSONPath pe propriul tău JSON, în browser. Filtre, felii, parcurgere recursivă, căi și JSON Pointer, cu exemple gata făcute.

Cum testezi o expresie JSONPath

  1. Lipește JSON-ul în Date JSON sau apasă Încarcă date de probă pentru a folosi exemplul clasic cu librăria.
  2. Scrie o expresie în Expresie JSONPath sau alege una din Exemple.
  3. Rezultatul se actualizează pe măsură ce scrii; Rulează interogarea o rulează din nou. Linia de stare indică numărul de potriviri.
  4. Folosește Arată pentru a comuta între Valori, Căi, JSON Pointer și Căi și valori, apoi copiază rezultatul.

Sintaxa JSONPath pe scurt

Sintaxă Semnificație Exemplu
$ rădăcina documentului $
.name sau ['name'] un copil $.store.bicycle
* fiecare copil $.store.*
.. parcurgere recursivă, la orice adâncime $..author
[n] indice de listă, începând de la 0 $..book[2]
[start:end:step] felie; numerele negative se numără de la sfârșit $..book[-1:]
[a,b] reuniune $..book[0,1]
[?(expr)] filtru $..book[?(@.price < 10)]
^ părintele fiecărei potriviri $..book[?(@.price > 20)]^
~ numele proprietății în loc de valoare $.store.*~

Rezultatele sunt returnate în ordinea din document. Căi oferă căi normalizate precum $['store']['book'][0]['title'], iar JSON Pointer oferă forma RFC 6901 /store/book/0/title, utilă pentru JSON Patch sau pentru căile de eroare ale validatoarelor JSON Schema.

Expresii de filtrare: ce este acceptat

Filtrele sunt evaluate cu jsonpath-plus în mod sigur: expresia este analizată și interpretată de un evaluator mic, niciodată dată lui eval sau new Function. În interiorul [?( … )] poți folosi:

  • @ pentru elementul curent, @.field și @['field'] pentru membrii lui, @root pentru întregul document ($ nu este disponibil în interiorul unui filtru);
  • comparațiile ==, !=, ===, !==, <, <=, >, >=;
  • logica &&, ||, !, aritmetica + - * / % și operatorul ternar a ? b : c;
  • literali de tip șir, număr, true, false, null și expresii regulate;
  • metode ale valorilor înseși, de exemplu @.title.startsWith('S'), @.tags.includes('new') sau @.title.match(/lord/i);
  • @property (cheia sau indicele elementului curent), @parent și @path (calea lui normalizată), în stilul jsonpath-plus.

Accesul la constructor, __proto__ și la constructorul Function este blocat. Dacă un filtru eșuează pe un element, de exemplu @.isbn.startsWith('0') pe o carte fără isbn, acel element pur și simplu nu se potrivește; o eroare de sintaxă în expresie este raportată. Filtrele scrise în stilul RFC 9535, [?@.price < 10] fără paranteze, sunt acceptate și citite ca [?(@.price < 10)]. Funcțiile RFC 9535 precum length(), count(), match() și search() nu sunt disponibile: folosește în schimb metode JavaScript precum @.name.length.

Selectoarele de tip din jsonpath-plus funcționează și la sfârșitul unei căi: $..*@number() returnează fiecare număr, iar @string(), @boolean(), @array(), @object(), @null() și @integer() fac același lucru pentru celelalte tipuri.

Întrebări frecvente

Este JSON-ul meu trimis către un server?

Nu. Analiza și evaluarea au loc în browserul tău, iar datele nu părăsesc calculatorul tău.

De ce filtrul meu nu returnează nimic?

Verifică dacă calea de dinaintea filtrului selectează o listă sau un obiect: $.store.book[?(@.price < 10)] filtrează cărțile, în timp ce $.store[?(@.price < 10)] se uită la book și bicycle. O proprietate lipsă dintr-un element este undefined, deci comparațiile cu ea sunt false.

Care este diferența dintre `==` și `===`?

Ca în JavaScript, == convertește tipurile ("10" == 10 este adevărat), în timp ce === compară tipul și valoarea.

De ce rezultatul este limitat?

Doar primele 10.000 de potriviri sunt scrise în rezultat, pentru ca pagina să rămână receptivă; linia de stare indică numărul total.

Este JSONPath standardizat?

Da, din 2024, prin RFC 9535. Implementările diferă totuși, mai ales la filtre; instrumentul urmează jsonpath-plus, sintaxa JSONPath-ului original al lui Stefan Goessner.