ما هو JSONPath؟
JSONPath لغة استعلام لاختيار القيم داخل مستند JSON، كما يختار XPath العُقد في XML: التعبير $.store.book[*].author يلتقط كل مؤلف. جرى توحيدها عام 2024 في RFC 9535 الذي ثبّت الصياغة ومعنى المرشّحات التي اختلفت فيها التطبيقات السابقة.
كيفية استخدام مختبِر JSON Path
- الصق مستند JSON.
- اكتب تعبير JSONPath مثل $.store.book[?(@.price < 10)].title.
- افحص النتائج المطابقة؛ وانسخ القيم أو المسارات.
مزايا مختبِر JSON Path
- صياغة JSONPath الأصلية (السابقة لـ RFC 9535): الوصول بالنقطة/الأقواس، وأحرف البدل، والنزول التكراري، والشرائح، والاتحادات، والتصفية بين قوسين
- تعبيرات تصفية بالمقارنات والتعبيرات النمطية (=~) وin / nin والعمليات الحسابية والمنطق البولياني
- تقييم آمن — دون eval()، إذ تُحلَّل التعبيرات إلى شجرة صياغة مجردة (AST)
- النتائج كجدول (المسار والنوع والقيمة) ومصفوفة JSON بالقيم وقائمة بمسارات النتائج المطابقة
- تقييم فوري أثناء تحرير التعبير أو المستند
- أخطاء صياغة واضحة تشير إلى موضع المشكلة
مثال على مختبِر JSON Path
العثور على الكتب الرخيصة
الإدخال:
$.store.book[?(@.price < 10)].titleالنتيجة:
$.store.book[0].title "Sayings of the Century"
$.store.book[2].title "Moby Dick"@ كل كتاب بدوره، لذا لا يصل إلى .title إلا كتابان من الكتب الأربعة.- 1
$الجذر: المستند كله، عقدة واحدة - 2
.storeالابنstoreلتلك العقدة: كائن واحد$.store - 3
.bookالابنbook: مصفوفة واحدة من 4 كتب$.store.book - 4
[?(@.price < 10)]تصفية بين قوسين:[?(…)]يختبر كل كتاب، حيث@هو الكتاب قيد الاختبار. يبقى كتابان:book[0]8.95،book[2]8.99$.store.book[0] $.store.book[2]فرع: استُبعد كتابان:
book[1]12.99،book[3]22.99 - 5
.titleالابنtitleلكل كتاب باقٍ: نصّان$.store.book[0].title $.store.book[2].title
بعد ذلك:مطابقتان: "Sayings of the Century"، "Moby Dick"
تعبير المثال أعلاه، مطبَّقاً على مستند الأداة النموذجي («تحميل مثال»). تحت الخطوات 2–5: المسارات التي تعيدها كل خطوة.
الأسئلة الشائعة حول مختبِر JSON Path
ما ميزات JSONPath المدعومة؟
تتبع الأداة صياغة JSONPath الأصلية التي اعتمدتها معظم المكتبات قبل RFC 9535 (2024): صيغتا النقطة والأقواس المربعة، وأحرف البدل (*)، والنزول التكراري (..)، وفهارس المصفوفات بما فيها السالبة، والشرائح [start:end:step]، والاتحادات [0,2] و["a","b"]، والتصفية [?(…)]، وصيغة البرنامج النصي (@.length-1). ولا تُقبل صيغ RFC 9535 المختلفة عنها: فالتصفية تحتاج إلى قوسين ([?(@.price < 10)] لا [?@.price < 10])، والدوال length() وcount() وmatch() وsearch() وvalue() غير متاحة.
ماذا يمكنني كتابته داخل التصفية؟
المقارنات (==, !=, <, <=, >, >=)، والتعبيرات النمطية (@.name =~ /^a/i)، والانتماء (@.tag in ["a","b"])، ووجود الخاصية (@.isbn)، والعمليات الحسابية والمعاملات المنطقية (&&, ||, !). كما يُسمح بالإشارة إلى الجذر ($). والمعاملات =~ وin وnin وcontains امتدادات من مكتبات أقدم، وليست من صياغة RFC 9535.
هل تقييم التصفية آمن؟
نعم. تُحلَّل التعبيرات إلى شجرة صياغة مجردة صغيرة وتقيّمها الأداة بنفسها — ولا يُستخدم eval() أو Function() أبداً، لذا لا يمكن تنفيذ أي كود عشوائي.
ما المسار المعروض لكل نتيجة مطابقة؟
هو الموقع الفريد للنتيجة بصيغة النقطة/الأقواس، مثل $.store.book[2].title. استخدمه للإشارة إلى القيمة بدقة في الاختبارات أو التوثيق. وهو ليس «المسار المعياري» (Normalized Path) الذي يعرّفه RFC 9535، إذ يستخدم ذلك الأقواس وحدها مع أسماء بين علامتي اقتباس مفردتين: $['store']['book'][2]['title'].
ملاحظات تقنية
يُقسَّم المسار إلى رموز (tokens) تمثّل مقاطع مختلفة (ابن، حرف بدل، فهرس، شريحة، اتحاد، تصفية، برنامج نصي). وتُترجم عبارات التصفية إلى شجرة تعبيرات صغيرة تدعم المعاملات ==، !=، <، <=، >، >=، =~، in، nin، contains، &&، ||، !، والسالب الأحادي، و+ − * / %. أما المقارنات بين أنواع غير متطابقة فتُقيَّم إلى false، على غرار سلوك مكتبات JSONPath الشائعة.
المراجع
- RFC 9535: JSONPath: Query Expressions for JSONصياغة JSONPath القياسية — الجذر والأبناء والأحفاد والمحدِّدات الشاملة ومرشّحات الاختيار — وكيفية تقييم الاستعلام.
- RFC 8259: The JavaScript Object Notation (JSON) Data Interchange Formatقواعد JSON: الكائنات والمصفوفات والنصوص والأرقام والقيم الثلاث الثابتة، وUTF-8 كترميز للتبادل.