مختبِر JSONPath مجاني — قيّم الاستعلامات
اختبر تعبيرات JSONPath على أي JSON فوريًا. محرّك معياري RFC 9535 إلى جانب وضع Goessner الكلاسيكي، وعروض القيم/المسارات/كليهما، ومسارات مُطبَّعة، وبدون eval. خاص 100٪، يعمل في متصفحك، بلا رفع وبلا تسجيل.
ما هو مختبِر JSONPath؟
مختبِر JSONPath أداة تتيح لك كتابة تعبير JSONPath، ولصق مستند JSON، ورؤية العقد التي يختارها التعبير بالضبط — القيم المطابِقة ومواقعها الدقيقة معًا — دون كتابة شِفرة أو تشغيل سكربت. وهو يختصر للمطوّرين الحلقة من دقائق إلى أجزاء من الثانية: عدّل المسار، وراقب تغيّر النتيجة، وأطلِق الاستعلام بثقة.
JSONPath لغة استعلام لـ JSON، نظير JSON لـ XPath في XML. يُبنى التعبير من أبجدية صغيرة من المُحدِّدات. $ هو جذر المستند. والنقطة أو القوس يخطو إلى ابن: $.store أو $['store']. والنقطة المزدوجة .. نزول تعاودي — يبحث في كل مستوى من الشجرة. وحرف البدل * يختار كل العناصر أو الأعضاء. وتحمل الأقواس فهارس المصفوفات ([0])، والشرائح ([start:end:step])، والاتحادات ([a,b])، وتعبيرات الترشيح ([?(@.price < 10)]، حيث @ هو العنصر الجاري اختباره). بهذه القطع يمكنك سحب حقل واحد من استجابة API عميقة التداخل، والتأكيد على القيم في الاختبارات، وقيادة تحويلات البيانات في أنظمة مثل Kubernetes وAWS Step Functions وAzure Logic Apps، أو استخراج بيانات مهيكلة من JSON غير منتظم — كل ذلك دون شِفرة اجتياز إجرائية. وJSONPath أيضًا مشهور بعدم اتساقه بين التطبيقات، وهذه بالضبط المشكلة التي يكشفها المختبِر الجيد قبل أن تصل إلى الإنتاج.
يأتي هذا المختبِر بمحرّكين. الافتراضي محرّك RFC 9535: وRFC 9535 هي مواصفة IETF الرسمية لـ JSONPath في فبراير 2024، وأول مرة تُوحَّد فيها اللغة بدقة بعد خمسة عشر عامًا من التطبيقات المتباينة. تُعرِّف قواعد دقيقة، ومفهوم المسارات المُطبَّعة للنتائج، وخمس دوال معيارية — length() وcount() وmatch() وsearch() وvalue(). محرّكنا RFC 9535 تطبيق بلا تبعيات لا يستخدم eval، فيحلّل التعبيرات ويُفسّرها بقواعده الخاصة بدلًا من ترجمتها إلى JavaScript. والمحرّك الثاني هو الكلاسيكي (Goessner)، اللهجة الفعلية لعام 2007 التي تطبّقها معظم الأدوات والمكتبات الأقدم؛ بدّل إليه لإعادة إنتاج نتائج من أداة مثل jsonpath.com أو لتشغيل تعبير نسخته من شِفرة قديمة. تتفق اللهجتان على المسارات الشائعة لكنهما تتباينان في الحالات الحدّية — المسافات والاقتباس في الترشيح، وترتيب الاتحاد، وكيف تُقارَن الأعضاء الغائبة، وأي الدوال موجودة — لذا القدرة على التبديل بينهما في مكان واحد هي أسرع وسيلة لتشخيص سبب اختلاف سلوك تعبير عمّا توقّعت.
ما يكشفه المختبِر وراء القيم الخام: نتيجة استعلام JSONPath هي قائمة عقد، ويمكن لهذه الأداة عرضها بثلاث طرق. عرض Values يُصيّر العقد المطابِقة كمصفوفة JSON، تمامًا كما تستهلكها في الشِفرة. وعرض Paths يُصيّر المسار المُطبَّع لكل مطابقة — موقعًا قانونيًا بأقواس مقتبسة مثل $['store']['book'][0]['title'] يحدّد بشكل فريد أين تعيش القيمة في المستند، مهما كُتب التعبير. تعبيران يختاران العقدة نفسها يُنتجان المسار المُطبَّع نفسه، مما يجعل عرض Paths لا يُقدَّر بثمن للتنقيح. وعرض Both يُظهر القيم والمسارات جنبًا إلى جنب. ويُبلِّغ سطر الإحصاءات كم عقدة طابقت.
الأمن هنا اهتمام من الدرجة الأولى. كثير من مُقيّمات JSONPath عبر الإنترنت تعمل على خادم، أو تضمّن مكتبة تُقيّم شروط الترشيح بـ eval في JavaScript — التصميم الذي أنتج ثغرات تنفيذ الشِفرة عن بُعد المتتبَّعة كـ CVE-2024-21534 وCVE-2025-1302 في حِزم JSONPath واسعة الاستخدام. هذه الأداة لا تستخدم eval إطلاقًا. محرّك RFC 9535 بلا مسار eval، والمحرّك الكلاسيكي مبني على إصدار مُصحَّح ومثبّت من jsonpath-plus مع تعطيل eval صراحةً. وهذا يُغلق صنف ثغرات تنفيذ الشِفرة عن بُعد ويتيح للأداة العمل ضمن سياسة أمان محتوى صارمة تمنع unsafe-eval. وكل تقييم محلي: لا يغادر JSON الخاص بك وتعبيرك الصفحة أبدًا، ولا يُسجَّلان، ولا يُخزَّنان على القرص — فقط تفضيلات المحرّك والعرض تستمر في localStorage. هذا يجعل الأداة آمنة لحمولات API المملوكة، والسجلات المُنقّحة، والإعدادات الداخلية، وأي بيانات بمخطّط لن تلصقه في خدمة قائمة على خادم.
إن كانت معالجة JSON مهمتك، فاقرنها ببقية أدوات JSON على الموقع: نسّق مُدخَلك واطبعه بجمال بـ مُنسِّق JSON، وقارن مستندين بـ مقارنة JSON، وافحص حمولة مقابل مخطّط بـ مُدقِّق مخطّط JSON، أو حوّل استجابة عيّنة إلى واجهات مُنمَّطة بـ JSON إلى 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 الميزات الرئيسية
محرّك RFC 9535 المعياري (بلا eval)
المحرّك الافتراضي يطبّق RFC 9535، مواصفة IETF الرسمية لـ JSONPath لعام 2024 — قواعد دقيقة، ومسارات مُطبَّعة، والدوال المعيارية الخمس. وهو بلا تبعيات ولا يستخدم eval، فيحلّل التعبيرات ويُفسّرها بقواعده الخاصة بدلًا من ترجمتها إلى JavaScript. ويعمل ضمن سياسة أمان محتوى صارمة.
وضع التوافق الكلاسيكي (Goessner)
مفتاح واحد يبدّل إلى محرّك متوافق مع Goessner (مبني على jsonpath-plus، مُهيّأ مع تعطيل eval) كي تتصرّف التعبيرات المنسوخة من أدوات أقدم مثل jsonpath.com كما رأيتها هناك. بدّل بين RFC 9535 والكلاسيكي لمقارنة النتائج وتشخيص سبب اختلاف مطابقة مسار عبر اللهجات.
ثلاثة عروض للنتيجة: القيم والمسارات وكلاهما
يُصيّر Values العقد المطابِقة كمصفوفة JSON، تمامًا كما تستهلكها في الشِفرة. ويُصيّر Paths المسار المُطبَّع لكل مطابقة مثل $['store']['book'][0]['title']. ويُظهر Both الاثنين جنبًا إلى جنب كي تربط كل قيمة بموقعها الدقيق. ويستمر العرض النشط عبر الجلسات.
مسارات مُطبَّعة لكل مطابقة
تحمل كل نتيجة مسارها المُطبَّع القانوني بأقواس مقتبسة — طريقة RFC 9535 لتحديد موقع عقدة بشكل فريد بصرف النظر عن كيفية كتابة التعبير. تعبيران يصيبان العقدة نفسها يُنتجان المسار المُطبَّع نفسه، مما يجعل تنقيح الاستعلامات الملتبسة مباشرًا.
دعم كامل للمُحدِّدات
الجذر $، والعنصر الحالي @، والابن .name، والنزول التعاودي ..name، وحرف البدل [*]، وفهرس المصفوفة [0]، والشريحة [start:end:step]، والاتحاد [a,b]، وتعبيرات الترشيح [?()] بمعاملات المقارنة والمنطق. وتوثّق ورقة غش مدمجة كل مُحدِّد فلا تغادر الصفحة أبدًا للبحث عن أحدها.
امتدادات دوال RFC 9535
استدعِ length() وcount() وmatch() وsearch() وvalue() داخل التعبيرات — عُدّ عناصر مصفوفة، أو اختبر سلسلة مقابل نمط I-Regexp، أو رشّح حسب حجم قائمة متداخلة. هذه الدوال المعيارية متاحة في المحرّك الافتراضي؛ وتخبرك الأداة بتبديل المحرّك إن استدعيتها في الوضع الكلاسيكي.
التنسيق والرفع والأمثلة
يطبع Format JSON مُدخَلك بجمال كي تكون البنية مقروءة قبل الاستعلام. ويقرأ Upload ملف .json أو .txt كاملًا في المتصفّح — ولا يُرسَل قط. وتُحمِّل قائمة Examples المنسدلة تعبيرات بدء معروفة الصحة على بيانات عيّنة كي ترى المحرّك يعمل قبل تكييف مسار.
مشاركة بروابط دائمة (بلا رفع)
يُرمِّز Copy link ملف JSON والتعبير والمحرّك والعرض داخل hash في العنوان. ولا ترسل المتصفّحات أجزاء العنوان في الطلبات أبدًا، فيُعيد الرابط المُشارَك حالتك كاملة على جهاز المستلِم دون مساس بخوادم go-tools.org. مكتفٍ ذاتيًا وصديق للتدقيق في التنقيح التعاوني.
خاص 100٪، في المتصفّح فقط
لا يغادر JSON الخاص بك وتعبيرك جهازك أبدًا. لا طلبات شبكة، ولا تسجيل، ولا تحليلات لما تكتبه — تحقّق في أدوات المطوّر ← الشبكة. فقط تفضيلات المحرّك والعرض تستمر في localStorage. آمن للحمولات المملوكة والسجلات المُنقّحة وأي بيانات لن تلصقها في jsonpath.com.
أمثلة محلولة
اختيار عنوان كل كتاب من مستند متجر كتب
$.store.book[*].title
["Sayings of the Century", "Sword of Honour", "Moby Dick", "The Lord of the Rings"]
الصق JSON متجر الكتب الكلاسيكي لـ Goessner، واكتب التعبير، فيعيد عرض القيم مصفوفة JSON تضم العناوين الأربعة جميعها. بدّل إلى عرض المسارات لترى كل نتيجة كمسار مُطبَّع مثل $['store']['book'][0]['title']. حرف البدل [*] يكرّر كل عنصر في مصفوفة book؛ بينما .title يسقط عضوًا واحدًا من كل عنصر.
ترشيح الكتب الأرخص من 10 باستخدام تعبير ترشيح
$.store.book[?(@.price < 10)].title
["Sayings of the Century", "Moby Dick"]
مُحدِّد الترشيح [?()] يُبقي فقط عناصر المصفوفة التي يتحقق فيها الشرط؛ و@ هو العنصر الحالي. على بيانات متجر الكتب (الأسعار 8.95 و12.99 و8.99 و22.99) يتأهّل كتابان. يقبل المحرّكان هذا الشكل، لكن لاحظ أن الوضع الكلاسيكي (Goessner) يكتب الترشيح نفسه على هيئة [?(@.price<10)] — بدّل المحرّك إن نسخت تعبيرًا من أداة أقدم.
اجتياز الشجرة كاملة عبر النزول التعاودي
$..author
["Nigel Rees", "Evelyn Waugh", "Herman Melville", "J. R. R. Tolkien"]
المُعامل .. ينزل إلى كل مستوى من المستند ويجمع كل عضو author أينما ظهر، بصرف النظر عن عمق التداخل. النزول التعاودي هو أسرع وسيلة لسحب حقل واحد من بنية عميقة التداخل أو غير منتظمة دون كتابة المسار الكامل.
تقطيع مصفوفة باستخدام [start:end:step]
$.store.book[0:2].title
["Sayings of the Century", "Sword of Honour"]
شرائح المصفوفة تتبع اتفاقية [start:end] نصف المفتوحة نفسها في Python وJavaScript: من الفهرس 0 حتى الفهرس 2 دون شموله يعيد أول كتابين. أضف حقلًا ثالثًا للخطوة — $.store.book[::2] يأخذ كل عنصر بالتناوب. الحدّ النهائي حصري، وهو فخّ شائع لانزياح بمقدار واحد يكشفه عرض المسارات بوضوح.
ترشيح حسب طول العنوان عبر الدالة length() في RFC 9535
$.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() واحدة من دوال RFC 9535 المعيارية الخمس، وهي صالحة فقط داخل تعبير ترشيح [?...] — وليست أبدًا كمقطع مسار مستقل مثل $.store.book.length()، الذي ترفضه قواعد RFC 9535 (هذا الشكل المقطعي امتداد من jsonpath-plus وليس JSONPath معياريًا). هنا يُبقي الترشيح كل كتاب يزيد طول عنوانه عن 15 محرفًا؛ فعلى بيانات متجر الكتب تُختار العناوين الأطول من 15 محرفًا (مثل Sayings of the Century وThe Lord of the Rings)، بينما تُستبعد الأقصر مثل Moby Dick وSword of Honour. وتُستخدم كذلك count() وmatch() وsearch() وvalue() داخل الترشيحات. هذه الدوال ميزة من RFC 9535 — بدّل إلى المحرّك المعياري (الافتراضي) لاستخدامها؛ فالوضع الكلاسيكي (Goessner) لا يطبّقها.
اختيار اتحاد عضوين مُسمّيين
$.store.book[0]['title','author']
["Sayings of the Century", "Nigel Rees"]
مُحدِّد الاتحاد [a,b] يجمع عدة أبناء في تعبير واحد. هنا يسحب عنوان أول كتاب ومؤلفه معًا. تعمل الاتحادات أيضًا مع فهارس المصفوفات — [0,2] يلتقط العنصرين الأول والثالث. ويقرن عرض Both كل قيمة بمسارها المُطبَّع لترى بالضبط أي عضو أنتج كل نتيجة.
كيفية استخدام مختبِر JSONPath
- 1
الصق أو ارفع ملف JSON
أفلِت JSON في صندوق الإدخال أو الصقه أو انقر Upload لتحميل ملف .json أو .txt من القرص. ويعيد Format JSON تنسيق المستند. ويُعلَّم JSON غير الصالح ضمنيًا برسالة من المُحلِّل قبل الاستعلام.
- 2
اختر محرّكًا
المحرّك RFC 9535 (معيار IETF لعام 2024، بلا eval) هو الافتراضي. بدّل إلى الكلاسيكي (Goessner) عند تشغيل تعبير منسوخ من أداة أقدم مثل jsonpath.com كي تطابِق النتائج ما رأيته هناك.
- 3
اكتب تعبير JSONPath
يُعرَض لك الرمز $ في البداية. ابدأ بمسار ابن مثل .store.book[*].title، أو فهرس مثل [0]، أو نزول تعاودي مثل ..author، أو ترشيح مثل [?(@.price < 10)]. وتتحدّث النتائج حيًّا أثناء الكتابة.
- 4
بدّل عرض النتيجة
يُظهر Values مصفوفة JSON من القيم المطابِقة. ويُظهر Paths المسار المُطبَّع لكل مطابقة مثل $['store']['book'][0]['title']. ويُظهر Both الاثنين جنبًا إلى جنب كي تربط كل قيمة بموقعها الدقيق في المستند.
- 5
انسخ النتيجة أو شارك رابطًا دائمًا
يُسقِط Copy result المخرَج على حافظتك. ويُرمِّز Copy link ملف JSON والتعبير والمحرّك والعرض داخل hash في العنوان (بلا رفع) كي يستطيع زميلك إعادة إنتاج الاستعلام نفسه محليًا على جهازه.
أخطاء JSONPath الشائعة
نسيان الجذر $ في البداية
يبدأ كل تعبير JSONPath من الجذر، المكتوب $. وحذفه (أو كتابة المسار كأن $ ضمني) يجعل معظم المحرّكات ترفض التعبير. ويُظهر المختبِر $ لك، فابدأ إدخالك بالمُحدِّد التالي — نقطة أو قوس أو نزول تعاودي.
store.book[*].title → invalid (no root)
$.store.book[*].title → selects every title
انزياح الشريحة بمقدار واحد — توقّع شمول فهرس النهاية
الشرائح نصف مفتوحة: [start:end] يمتد حتى end دون شموله. و[0:2] يعيد عنصرين (الفهرسان 0 و1)، لا ثلاثة. ولشمول العنصر الأخير حسب الفهرس، استخدم [start:] أو ادفع الحدّ النهائي خطوة أبعد.
$.store.book[0:2] → first TWO books, not three
$.store.book[0:3] → first three books (indices 0,1,2)
استخدام تعبير كلاسيكي في محرّك RFC 9535 (أو العكس)
تعبير منسوخ من jsonpath.com أو jsonpath-plus قد يُحلَّل أو يُطابِق نتائج مختلفة تحت RFC 9535 بسبب فروق الترشيح والاتحاد والدوال. إن بدت النتائج خاطئة، فبدّل مفتاح المحرّك ليطابِق اللهجة التي كُتب لها التعبير.
Classic filter run under RFC 9535 → parse error or unexpected nodes
Switch engine to Classic (Goessner) → reproduces the original result
استدعاء دالة RFC 9535 كمقطع مستقل
الدوال length() وcount() وmatch() وsearch() وvalue() امتدادات دالّية من RFC 9535 صالحة فقط داخل ترشيح [?...]. واستدعاء مقطع مستقل مثل $.store.book.length() ترفضه قواعد RFC 9535 (هو امتداد من jsonpath-plus وليس معياريًا). استدعِ الدالة داخل ترشيح، واستخدم المحرّك الافتراضي RFC 9535 — فالمحرّك الكلاسيكي (Goessner) لا يطبّق هذه الدوال.
$.store.book.length() → parse error (not a valid RFC 9535 segment)
$.store.book[?length(@.title) > 15] → books with a title over 15 chars
نسيان @ داخل تعبير الترشيح
داخل ترشيح [?()]، العنصر الحالي هو @ لا $. وكتابة $.price تشير إلى جذر المستند لا إلى العنصر تحت الاختبار، فيختار الترشيح لا شيء أو كل شيء. استخدم @ لعنونة أعضاء العنصر الجاري ترشيحه.
$.store.book[?($.price < 10)] → wrong scope
$.store.book[?(@.price < 10)] → books under 10
اقتباس اسم عضو بصيغة خاطئة
يحتاج ترميز الأقواس إلى علامات اقتباس حول مفاتيح السلاسل: يعمل $['store'] أو $.store كلاهما، لكن $[store] (غير مقتبس داخل الأقواس) خطأ فهرس/مُعرِّف. استخدم علامات الاقتباس داخل الأقواس لأي مفتاح به مسافات أو نقاط أو محارف خاصة: $['first name'].
$[store][book] → invalid bracket selectors
$['store']['book'] → same as $.store.book
توقّع توقّف النزول التعاودي عند المستوى الأول
التعبير $..author لا يتوقّف عند القمة — بل يجمع كل عضو author عند كل عمق. إن أردت الأبناء المباشرين فحسب، فاكتب المسار كاملًا. والنزول التعاودي فوق مستند كبير قد يعيد عقدًا أكثر بكثير مما قصدت.
$..price → every price anywhere in the tree
$.store.book[*].price → only book prices
من يستخدم هذه الأداة
- استخراج حقول من استجابة API
- اسحب مُعرِّفات الطلبات، أو سمات موارد متداخلة، أو قائمة أسماء من حمولة JSON دون كتابة شِفرة اجتياز. ابنِ المسار هنا على استجابة عيّنة، وتأكّد في عرض Values من أنه يعيد العقد التي تريدها بالضبط، ثم الصق التعبير المُتحقَّق منه في تطبيقك أو اختبارك.
- كتابة تأكيدات لاختبارات التكامل
- كثير من أطر الاختبار وأدوات اختبار العقود (REST Assured وKarate وPostman) تستخدم JSONPath للتأكيد على أجسام الاستجابات. صُغ مسار التأكيد هنا، وتحقّق من أنه يختار العقدة الصحيحة على استجابة حقيقية، وانسخه إلى اختبارك — لتلتقط مسارًا خاطئًا قبل أن تتعطّل المجموعة.
- تهيئة تحويلات البيانات في خطوط الأنابيب
- تقبل Kubernetes وAWS Step Functions وAzure Logic Apps وكثير من أدوات ETL صيغة JSONPath لعنونة الحقول في حمولات الأحداث. جرّب المسار الدقيق على حدث تمثيلي هنا، وتأكّد من أنه يُحَلّ، وأدرِجه في إعداد خط الأنابيب بثقة أنه يشير حيث تقصد.
- إعادة إنتاج نتيجة jsonpath.com بخصوصية
- لديك تعبير من مُقيّم قائم على خادم لكن لا يمكنك لصق بياناتك في موقع طرف ثالث؟ بدّل إلى الوضع الكلاسيكي (Goessner)، وحمّل ملف JSON، وأعِد إنتاج النتيجة نفسها محليًا — فلا تغادر أي حمولة متصفّحك، وتبقى البيانات المملوكة على جهازك.
- ترحيل التعبيرات القديمة إلى RFC 9535
- تنتقل إلى نظام يُعلن توافقه مع RFC 9535؟ شغّل تعبيرًا قديمًا في الوضع الكلاسيكي، ثم انتقل إلى محرّك RFC 9535 لترى إن كان لا يزال يُحلَّل ويُطابِق العقد نفسها. وتُحدِّد مقارنة المحرّكين بدقّة فروق الترشيح والاتحاد والدوال التي قد تصطدم بها في الإنتاج لولا ذلك.
- تنقيح سبب إعادة مسارٍ عقدًا خاطئة
- يصعب تعليل مسار يختار كثيرًا جدًا أو قليلًا جدًا من القيم وحدها. بدّل إلى عرض Paths لترى الموقع المُطبَّع لكل مطابقة — فهرس المصفوفة الدقيق وسلسلة الأعضاء الدقيقة — فيتّضح فورًا انزياح الشريحة بمقدار واحد أو النزول التعاودي الشارد.
- تعليم أو مراجعة JSONPath
- افتح تعبيرًا عاملًا على بيانات عيّنة واشرحه مُحدِّدًا تلو مُحدِّد، مبدّلًا بين Values وPaths كي يرى المتعلّم ما يُختار وأين يعيش معًا. وتمنح ورقة الغش والأمثلة المحلولة مرجعًا منظّمًا لمراجعة الشِفرة أو التأهيل.
ملاحظات المحرّك والخوارزمية
- محرّك RFC 9535 (jsonpath-rfc9535، بلا تبعيات)
- المحرّك الافتراضي يطبّق قواعد IETF RFC 9535 مباشرةً: يُجزّئ التعبير ويحلّله إلى شجرة بناء تجريدية ويُفسّره مقابل المستند. لا يوجد eval ولا باني Function في أي مكان من المسار، فهو محصّن ضد صنف ثغرات حقن eval ويعمل ضمن سياسة أمان محتوى صارمة.
- المحرّك الكلاسيكي (jsonpath-plus، eval مُعطَّل)
- المحرّك الكلاسيكي (Goessner) هو jsonpath-plus، مثبّت على إصدار مُصحَّح (>= 10.4.0) ومُهيّأ مع ضبط خيار eval على false صراحةً. يحفظ ذلك توافق لهجة Goessner مع إغلاق نواقل تنفيذ الشِفرة عن بُعد المتتبَّعة كـ CVE-2024-21534 وCVE-2025-1302، التي أثّرت في مسار الترشيح الافتراضي القائم على eval في المكتبة.
- توليد المسارات المُطبَّعة
- تُبلَّغ كل مطابقة بمسارها المُطبَّع وفق RFC 9535 — صيغة قانونية بترميز أقواس بعلامات اقتباس مفردة ($['store']['book'][0]['title']) مع فهارس المصفوفات أعدادًا صحيحة مجرّدة. المسارات المُطبَّعة مستقرة وفريدة لكل عقدة، فالتعبيرات المتكافئة تُنتج مسارات متطابقة، وهو ما يعتمد عليه عرضا Paths وBoth للتعرّف على النتائج بلا لبس.
- تحميل أجزاء المحرّك بالكسل
- يُحمَّل كلا المحرّكين كأجزاء JavaScript منفصلة عند اختيارهما أول مرة فقط، فتبقى الصفحة الأولية خفيفة ولا يُنزَّل المحرّك الذي لا تستخدمه أبدًا. وتبديل المحرّكات يُعيد تقييم التعبير الحالي مقابل المستند الحالي فورًا، دون إعادة تحميل الصفحة.
- قراءة الملفات محليًا وتنسيق JSON
- يستخدم زر Upload واجهة FileReader في المتصفّح لقراءة ملف .json أو .txt إلى الإدخال كليًا في جانب العميل — فلا يُرسَل الملف قط. ويُحلِّل Format JSON الإدخال ويُعيد تسلسله بإزاحة مسافتين، مُظهِرًا أخطاء التحليل ضمنيًا فيُلتقَط JSON المُشوَّه قبل التقييم.
- الروابط الدائمة عبر hash العنوان (لا تُرسَل قط)
- تُرمَّز حالة المشاركة في جزء location.hash، حاملةً JSON والتعبير والمحرّك النشط وعرض النتيجة. ولا تُدرِج المتصفّحات الجزء في طلبات HTTP أبدًا، فتتلقّى خوادم go-tools.org صفرًا من البيانات عند فتح رابط دائم؛ وتجري التهيئة كليًا على جهاز المستلِم.
أفضل ممارسات JSONPath
- اختر المحرّك المطابِق لهدفك
- إن كان نظامك التابع يُعلن توافقه مع RFC 9535، فاكتب وتحقّق مقابل محرّك RFC 9535. وإن كنت تُعيد إنتاج أو تصون تعبيرًا من أداة أو مكتبة أقدم، فاستخدم الكلاسيكي (Goessner). والتحقّق مقابل اللهجة الخاطئة هو أكثر أسباب فشل مسار نجح في المختبِر داخل الإنتاج شيوعًا.
- تحقّق بعرض المسارات لا بالقيم وحدها
- يخبرك عرض Values بما طابَق؛ ويخبرك عرض Paths بالمكان. حين يعيد استعلام قيمًا تبدو صحيحة قد يظل يختارها من موقع خاطئ — نزول تعاودي شارد أو حرف بدل مفرط الاتساع. افحص المسارات المُطبَّعة لتأكيد أن التعبير يصيب العقد التي تقصدها بالضبط.
- انتبه إلى الحد النهائي الحصري للشريحة
- التعبير [0:2] يختار الفهرسين 0 و1، لا 0 حتى 2 — فالحدّ النهائي حصري، تمامًا كما في Python وJavaScript. وأخطاء انزياح الشرائح بمقدار واحد أكثر أخطاء JSONPath تكرارًا. استخدم عرض Paths لقراءة الفهرس الدقيق لكل عنصر مُختار وتأكيد الحدود قبل الإطلاق.
- فضّل مسارًا صريحًا على النزول التعاودي ما أمكن
- التعبير $..price مريح لكنه يُطابِق كل price في أي مكان من المستند، بما في ذلك ما لم تقصده. حين تعرف البنية، اكتب المسار كاملًا ($.store.book[*].price) كي يبقى الاستعلام دقيقًا ومتوقّعًا مع نمو البيانات. واحجز .. للأشكال غير المنتظمة أو المجهولة حقًا.
- حافظ على اتساق المسافات والاقتباس في الترشيحات
- تتبع RFC 9535 قواعدها بدقة في تعبيرات الترشيح، بينما اللهجة الكلاسيكية أكثر تساهلًا. اكتب الترشيحات بنظافة — اقتبس السلاسل الحرفية بعلامات اقتباس مفردة ('fiction')، وأبقِ المعاملات متباعدة، وتجنّب الاعتماد على التحليل المتساهل — كي يُقيَّم التعبير نفسه بالطريقة نفسها أيًّا كان المحرّك أو المكتبة التي تشغّله في النهاية.
الأسئلة الشائعة
هل يُرسَل ملف JSON أو تعبير JSONPath إلى خادمكم؟
ما هو JSONPath وفيمَ يُستخدَم؟
ما الفرق بين RFC 9535 وصيغة Goessner الكلاسيكية؟
لماذا يعيد التعبير نفسه نتائج مختلفة في المحرّكين، وكيف أستخدم تعبيرًا منسوخًا من jsonpath.com؟
كيف تعمل تعبيرات الترشيح [?()]؟
ماذا يفعل النزول التعاودي (..)؟
ما دوال RFC 9535: length() وcount() وmatch() وsearch() وvalue()؟
كيف تعمل شرائح المصفوفة [start:end:step]؟
ما مُحدِّد الاتحاد وكيف أختار عدة مفاتيح دفعةً واحدة؟
هل يمكنني مشاركة استعلام JSONPath وبياناته عبر رابط؟
هل هناك حد أقصى لحجم JSON؟
كيف يختلف هذا عن jsonpath.com وهل هو آمن — بلا eval؟
ماذا تعرض عروض القيم والمسارات وكليهما؟
هل يعمل دون اتصال، وماذا عن سياسة أمان المحتوى؟
أدوات ذات صلة
عرض جميع الأدوات →محوّل Base64 — ترميز وفك ترميز أونلاين
الترميز والتنسيق
رمّز وفك ترميز Base64 مجاناً أونلاين — محوّل فوري مع دعم UTF-8 والرموز التعبيرية. خصوصية 100% — يعمل في متصفّحك. جرّبه الآن.
محوّل Base64 إلى صورة أونلاين
الترميز والتنسيق
فك ترميز سلسلة Base64 أو عنوان URI للبيانات إلى صورة داخل متصفّحك. عاين واقرأ الأبعاد ونوع MIME ثم نزّل كـ PNG أو JPG أو GIF أو SVG. بلا رفع.
محوّل CSV إلى JSON
الترميز والتنسيق
حوّل CSV إلى JSON في متصفحك. RFC 4180، استنتاج الأنواع، صف العنوان، أمان الأعداد الكبيرة. خصوصية 100%.
محوّل .env إلى JSON
الترميز والتنسيق
الصق ملف .env واحصل على JSON فورًا. كلمات مرور قاعدة بياناتك ومفاتيح API لا تغادر متصفحك أبدًا — خاص 100٪، بلا رفع، محلّل dotenv مجاني.
محوّل HTML إلى Markdown
الترميز والتنسيق
حوّل HTML إلى Markdown نظيف داخل متصفّحك — جداول GFM وقوائم مهام وروابط. اختر عناوين ATX/Setext وروابط مضمّنة أو مرجعية. مثالي لترحيل محتوى الويب أو تغذية نماذج LLM. خصوصية 100% بلا رفع.
محوّل الصور إلى Base64 أونلاين
الترميز والتنسيق
حوّل الصور إلى عناوين URI للبيانات بصيغة Base64 داخل متصفّحك — PNG وJPG وGIF وWebP وSVG وICO. انسخ مخرجات HTML وCSS وMarkdown وJSON. خصوصية 100% بلا رفع.