Utilia

أداة اختبار JSONPath

اختبر تعبيرات JSONPath على بيانات JSON الخاصة بك في المتصفح: مرشّحات وشرائح وبحث متداخل ومسارات ومؤشرات JSON Pointer، مع أمثلة جاهزة.

كيفية اختبار تعبير JSONPath

  1. الصق بياناتك في بيانات JSON، أو انقر تحميل بيانات تجريبية لاستخدام مثال متجر الكتب الكلاسيكي.
  2. اكتب تعبيرًا في خانة تعبير JSONPath، أو اختر واحدًا من أمثلة.
  3. تتحدّث النتيجة أثناء الكتابة، ويعيد زر تنفيذ الاستعلام تشغيله. ويعرض سطر الحالة عدد التطابقات.
  4. استخدم عرض للتبديل بين القيم والمسارات ومؤشرات JSON Pointer والمسارات والقيم، ثم انسخ النتيجة.

صياغة JSONPath باختصار

الصياغة المعنى مثال
$ جذر المستند $
.name أو ['name'] عنصر ابن $.store.bicycle
* كل الأبناء $.store.*
.. بحث متداخل على أي عمق $..author
[n] فهرس في مصفوفة، بدءًا من 0 $..book[2]
[start:end:step] شريحة؛ الأرقام السالبة تُعدّ من النهاية $..book[-1:]
[a,b] اتحاد $..book[0,1]
[?(expr)] مرشّح (فلتر) $..book[?(@.price < 10)]
^ العنصر الأب لكل تطابق $..book[?(@.price > 20)]^
~ اسم الخاصية بدل قيمتها $.store.*~

تُعاد النتائج بترتيب ظهورها في المستند. يعطي خيار المسارات مسارات موحّدة مثل $['store']['book'][0]['title']، ويعطي مؤشرات JSON Pointer الصيغة المعرّفة في RFC 6901 مثل /store/book/0/title، وهي مفيدة مع JSON Patch أو مع مسارات الأخطاء في مدقّقات JSON Schema.

تعبيرات الترشيح: ما المدعوم؟

تُقيَّم المرشّحات باستخدام مكتبة jsonpath-plus في الوضع الآمن: يُحلَّل التعبير ويفسّره مقيِّم صغير، ولا يُمرَّر أبدًا إلى eval أو new Function. داخل [?( … )] يمكنك استخدام:

  • @ للعنصر الحالي، و@.field و@['field'] لأعضائه، و@root للمستند كله (لا يتوفر $ داخل المرشّح)؛
  • المقارنات == و!= و=== و!== و< و<= و> و>=؛
  • العمليات المنطقية && و|| و!، والعمليات الحسابية + - * / %، والعامل الثلاثي a ? b : c؛
  • القيم الحرفية للسلاسل النصية والأرقام وtrue وfalse وnull والتعابير النمطية؛
  • توابع القيم نفسها، مثل @.title.startsWith('S') أو @.tags.includes('new') أو @.title.match(/lord/i)؛
  • @property (مفتاح العنصر الحالي أو فهرسه)، و@parent، و@path (مساره الموحّد)، على طريقة jsonpath-plus.

الوصول إلى constructor و__proto__ ومُنشئ Function محظور. وإذا فشل المرشّح مع عنصر ما، مثل @.isbn.startsWith('0') على كتاب لا يملك isbn، فإن ذلك العنصر ببساطة لا يتطابق، أما الخطأ في صياغة التعبير فيُبلَّغ عنه. وتُقبل المرشّحات المكتوبة على طريقة RFC 9535، أي [?@.price < 10] دون أقواس، وتُقرأ على أنها [?(@.price < 10)]. أما دوال RFC 9535 مثل length() وcount() وmatch() وsearch() فغير متوفرة: استخدم بدلًا منها توابع JavaScript مثل @.name.length.

تعمل أيضًا محددات الأنواع الخاصة بـjsonpath-plus في نهاية المسار: $..*@number() يعيد كل الأرقام، وتؤدي @string() و@boolean() و@array() و@object() و@null() و@integer() الشيء نفسه مع الأنواع الأخرى.

الأسئلة الشائعة

هل تُرسل بيانات JSON الخاصة بي إلى خادم؟

لا. يجري التحليل والتقييم في متصفحك، ولا تغادر بياناتك جهازك أبدًا.

لماذا لا يعيد مرشّحي أي نتيجة؟

تأكد من أن المسار الذي يسبق المرشّح يحدد مصفوفة أو كائنًا: فالتعبير $.store.book[?(@.price < 10)] يرشّح الكتب، بينما يفحص $.store[?(@.price < 10)] العنصرين book وbicycle. والخاصية الغائبة عن عنصر ما قيمتها undefined، فتكون المقارنات معها خاطئة.

ما الفرق بين `==` و`===`؟

كما في JavaScript، يحوّل == الأنواع ("10" == 10 صحيح)، بينما يقارن === النوع والقيمة معًا.

لماذا النتائج المعروضة محدودة؟

لا يُكتب في النتيجة سوى أول 10000 تطابق، لتبقى الصفحة سريعة الاستجابة، ويعرض سطر الحالة العدد الكامل.

هل JSONPath معيار موحّد؟

نعم، منذ عام 2024 بموجب RFC 9535. لكن التطبيقات ما زالت تختلف، خصوصًا في المرشّحات، وتتبع هذه الأداة jsonpath-plus، أي صياغة JSONPath الأصلية التي وضعها Stefan Goessner.