Skip to content

مختبِر JSONPath مجاني — قيّم الاستعلامات

اختبر تعبيرات JSONPath على أي JSON فوريًا. محرّك معياري RFC 9535 إلى جانب وضع Goessner الكلاسيكي، وعروض القيم/المسارات/كليهما، ومسارات مُطبَّعة، وبدون eval. خاص 100٪، يعمل في متصفحك، بلا رفع وبلا تسجيل.

بدون تتبّع يعمل في المتصفّح مجاني
كل تقييم يجري محليًا في متصفّحك. لا يغادر JSON الخاص بك وتعبيرك هذا الجهاز أبدًا. بلا eval، وبلا رفع.
المحرّك
 
ورقة غش JSONPath
$عنصر الجذر
@العنصر الحالي (في الترشيحات)
.nameعضو ابن
..nameنزول تعاودي
[*]كل العناصر / الأعضاء
[0]فهرس المصفوفة
[0:2]شريحة مصفوفة [start:end:step]
[a,b]اتحاد أسماء / فهارس
[?(@.k>1)]تعبير ترشيح
length()دالة RFC 9535: length / count / match / search / value
روجِع من حيث وفاء قواعد RFC 9535، وصحّة المسارات المُطبَّعة، وتكافؤ دلالة المحرّكين على المسارات الشائعة مع توثيق التباين في الحالات الحدّية، وسلامة انعدام eval (إغلاق CVE-2024-21534 وCVE-2025-1302)، وإمكانية الوصول (أدوار ARIA، ومجموعة أزرار راديو للمحرّك، وإعلانات قارئ الشاشة للنتائج، ومعالجة JSON من اليسار إلى اليمين ضمن تخطيطات RTL). — فريق أدوات البيانات في Go Tools · Jun 13, 2026

ما هو مختبِر 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. 1

    الصق أو ارفع ملف JSON

    أفلِت JSON في صندوق الإدخال أو الصقه أو انقر Upload لتحميل ملف .json أو .txt من القرص. ويعيد Format JSON تنسيق المستند. ويُعلَّم JSON غير الصالح ضمنيًا برسالة من المُحلِّل قبل الاستعلام.

  2. 2

    اختر محرّكًا

    المحرّك RFC 9535 (معيار IETF لعام 2024، بلا eval) هو الافتراضي. بدّل إلى الكلاسيكي (Goessner) عند تشغيل تعبير منسوخ من أداة أقدم مثل jsonpath.com كي تطابِق النتائج ما رأيته هناك.

  3. 3

    اكتب تعبير JSONPath

    يُعرَض لك الرمز $ في البداية. ابدأ بمسار ابن مثل .store.book[*].title، أو فهرس مثل [0]، أو نزول تعاودي مثل ..author، أو ترشيح مثل [?(@.price < 10)]. وتتحدّث النتائج حيًّا أثناء الكتابة.

  4. 4

    بدّل عرض النتيجة

    يُظهر Values مصفوفة JSON من القيم المطابِقة. ويُظهر Paths المسار المُطبَّع لكل مطابقة مثل $['store']['book'][0]['title']. ويُظهر Both الاثنين جنبًا إلى جنب كي تربط كل قيمة بموقعها الدقيق في المستند.

  5. 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 إلى خادمكم؟
لا. كل تقييم يجري بلغة JavaScript داخل متصفحك. مستند JSON الخاص بك وتعبير JSONPath لا يُرفعان ولا يُسجَّلان ولا يُخزَّنان على القرص ولا يُرسَلان إلى أي طرف ثالث. تُحفَظ في localStorage فقط تفضيلات الواجهة لديك — المحرّك النشط (RFC 9535 أو الكلاسيكي) وعرض النتائج (القيم/المسارات/كليهما) — كي تتذكّرها الصفحة في الزيارة التالية؛ أما JSON والتعبير نفساهما فلا يُحفظان أبدًا. يمكنك التحقّق بفتح أدوات المطوّر ← الشبكة: الكتابة في أي من الصندوقين لا تُطلق أي طلبات. هذا يجعل الأداة آمنة لحمولات API المملوكة، وعيّنات السجلات المُنقّحة، والإعدادات الداخلية، وأي شيء آخر لن ترغب في لصقه في مُقيّم يعتمد على خادم مثل jsonpath.com.
ما هو JSONPath وفيمَ يُستخدَم؟
JSONPath لغة استعلام لبيانات JSON، تمامًا كما أن XPath لغة استعلام لـ XML. تكتب تعبير مسار — مثل $.store.book[*].author — فيعيد المُقيّم كل قيمة في المستند يختارها المسار. يُستخدَم لسحب حقول محددة من استجابات API، وللتأكيد على القيم في اختبارات التكامل، ولتهيئة تحويلات البيانات في أدوات مثل Jenkins وKubernetes وAWS Step Functions وAzure Logic Apps، ولاستخراج بيانات من JSON كبير أو غير منتظم دون كتابة شِفرة اجتياز إجرائية. يُبنى التعبير من محور مُحدِّدات: $ (الجذر)، و. أو [] (الوصول إلى الأبناء)، و.. (النزول التعاودي)، و* (حرف البدل)، و[start:end:step] (شريحة المصفوفة)، و[a,b] (الاتحاد)، و[?()] (الترشيح). يُقيّم هذا المختبِر التعبير حيًّا ويعرض القيم المطابِقة ومساراتها المُطبَّعة معًا.
ما الفرق بين RFC 9535 وصيغة Goessner الكلاسيكية؟
صيغة JSONPath الكلاسيكية هي الصيغة الفعلية التي نشرها Stefan Goessner عام 2007. انتشر تطبيقها على نطاق واسع لكنها لم تُوحَّد رسميًا قط، لذا تباينت سلوكيات دقيقة عبر المكتبات — كيفية كتابة الترشيحات، وكيف يعمل الاتحاد ودالة الجذر، وكيف تُقارَن القيم الغائبة. أما RFC 9535، التي نشرتها IETF في فبراير 2024، فهي أول مواصفة رسمية لـ JSONPath. تحدّد قواعد دقيقة، وتُعرِّف المسارات المُطبَّعة للنتائج، وتضيف دوالًا معيارية (length وcount وmatch وsearch وvalue). الاثنتان متقاربتان لكنهما غير متطابقتين: RFC 9535 أشدّ صرامة في المسافات والاقتباس داخل الترشيحات، وتُعرّف دلالات المقارنة للأعضاء الغائبة، وترفض بعض البِنى المرنة التي تحمّلتها اللهجة الكلاسيكية. تعتمد هذه الأداة افتراضيًا محرّك RFC 9535 (تطبيق بلا تبعيات وبلا eval) وتتيح لك التبديل إلى محرّك كلاسيكي (Goessner) من أجل التوافق العكسي.
لماذا يعيد التعبير نفسه نتائج مختلفة في المحرّكين، وكيف أستخدم تعبيرًا منسوخًا من jsonpath.com؟
لأن RFC 9535 ولهجة Goessner الكلاسيكية لهما قواعد مختلفة فعلًا في الحالات الحدّية — المسافات والاقتباس في الترشيح، وترتيب الاتحاد، وكيف تُقارَن الأعضاء الغائبة، وأي الدوال موجودة. تعبير مكتوب لمحرّك قد يُطابِق نتائج مختلفة (أو يفشل في التحليل) في الآخر. إن نسخت تعبيرًا من أداة أقدم مثل jsonpath.com أو jsonpath-plus أو خدمة قائمة على Jayway، فبدّل مفتاح المحرّك في الأعلى إلى الكلاسيكي (Goessner): ذلك الوضع يشغّل مُقيّمًا متوافقًا مع Goessner (مبني على jsonpath-plus مُهيّأ مع تعطيل eval) وسيُعيد إنتاج السلوك الذي رأيته في الأداة المصدر. أما إن كنت تكتب تعبيرًا جديدًا أو تستهدف نظامًا يُعلن توافقه مع RFC 9535، فأبقِ المحرّك الافتراضي RFC 9535. وقد كُتبت ورقة الغش والأمثلة المدمجة لتُقيَّم بصورة متطابقة في المحرّكين كي تبدأ من نقطة معروفة الصحة.
كيف تعمل تعبيرات الترشيح [?()]؟
مُحدِّد الترشيح يُبقي فقط عناصر المصفوفة (أو أعضاء الكائن) التي يتحقق فيها الشرط. وداخل الترشيح يشير @ إلى العنصر الجاري اختباره. التعبير $.store.book[?(@.price < 10)] يعيد كل كتاب سعره أقل من 10. يمكنك المقارنة بقيم حرفية (@.category == 'fiction')، ودمج الشروط بـ && و||، واختبار وجود عضو (@.isbn يختار العناصر التي تملك isbn أصلًا)، وفي RFC 9535 استخدام امتدادات الدوال داخل الشرط (?(length(@.tags) > 2)). معاملات المقارنة هي == و!= و< و<= و> و>=. وRFC 9535 دقيقة بشأن الأنواع: مقارنة عضو غائب بقيمة محدّدة جيدًا ولا تُسبّب خطأً. أما اللهجة الكلاسيكية فأكثر تساهلًا مع المسافات، فكلٌّ من [?(@.price<10)] و[?(@.price < 10)] مقبول فيها؛ بينما تتبع RFC 9535 قواعدها بدقة.
ماذا يفعل النزول التعاودي (..)؟
المُعامل .. يبحث في كل مستوى من المستند، لا في الأبناء المباشرين فحسب. التعبير $..author يجمع كل عضو author أينما ورد — داخل الكائن الأعلى، وداخل المصفوفات، وداخل الكائنات المتداخلة، عند أي عمق. وهو أسرع وسيلة لاستخراج حقل من بنية عميقة التداخل أو غير منتظمة الشكل حين لا ترغب (أو لا تستطيع) كتابة المسار الكامل. يمكنك إتباع .. بأي مُحدِّد: $..book[*] يجد كل عنصر في كل مصفوفة book في أي مكان في الشجرة، و$..* يُعدِّد كل قيمة في المستند، و$..['price'] يجمع كل أعضاء price. وقد يُطابِق النزول التعاودي الكثير — بدّل إلى عرض المسارات لترى بالضبط من أين جاءت كل نتيجة عبر مسارها المُطبَّع.
ما دوال RFC 9535: length() وcount() وmatch() وsearch() وvalue()؟
تُعرِّف RFC 9535 خمسة امتدادات دالّية معيارية، والقاعدة الأساسية أنها قابلة للاستدعاء فقط داخل تعبير ترشيح [?...] — وليست أبدًا كمقطع مسار مستقل. كتابة $.store.book.length() غير صالحة في RFC 9535 وترفضها القواعد المعيارية (هذا الشكل من استدعاء المقطع امتداد من jsonpath-plus وليس جزءًا من المواصفة). تعيد length() طول سلسلة أو مصفوفة أو كائن، فتستخدمها للترشيح حسب الحجم: $.store.book[?length(@.title) > 15] يُبقي الكتب التي يزيد طول عنوانها عن 15 محرفًا. وتعيد count() عدد العقد التي تحتويها قائمة عقد، داخل ترشيح أيضًا: $.store.book[?(count(@.authors) > 1)]. وتختبر match() مطابقة سلسلة لتعبير نمطي على القيمة كاملة، وتختبر search() وجود مطابقة في أي موضع داخل السلسلة — وكلتاهما تأخذان نمط I-Regexp. وتحوّل value() قائمة عقد أحادية إلى قيمتها كي تُستخدم في مقارنة. هذه الدوال جزء من معيار RFC 9535 فهي متاحة في المحرّك الافتراضي؛ أما المحرّك الكلاسيكي (Goessner) فلا يطبّقها. إن فشل تعبير قائم على دالة، فتأكّد من أنك تستدعيها داخل ترشيح ومن أن المفتاح مضبوط على RFC 9535.
كيف تعمل شرائح المصفوفة [start:end:step]؟
تستخدم الشرائح اتفاقية نصف مفتوحة كما في Python وJavaScript: [start:end] يختار من الفهرس start حتى الفهرس end دون شموله، فـ [0:2] يعيد أول عنصرين (الفهرسان 0 و1). احذف حدًّا للوصول إلى الطرف — [2:] من الفهرس 2 فصاعدًا، و[:3] لأول ثلاثة. والفهرس السالب يُعَدّ من النهاية: [-1:] يختار العنصر الأخير. والحقل الثالث الاختياري خطوة — [::2] يأخذ كل عنصر بالتناوب، و[::-1] يعكس (في المحرّكات التي تدعم الخطوات السالبة). والحدّ النهائي الحصري هو أكثر أخطاء الشرائح شيوعًا؛ ويُظهر عرض المسارات الفهرس الدقيق لكل عنصر مُختار كي تتأكّد من الحدود بنظرة واحدة.
ما مُحدِّد الاتحاد وكيف أختار عدة مفاتيح دفعةً واحدة؟
مُحدِّد الاتحاد يُدرِج عدة أسماء أو فهارس داخل قوس واحد ويجمعها كلها: $['title','author'] يختار العضوين كليهما من كائن، و$.store.book[0,2] يختار العنصرين الأول والثالث من مصفوفة book. يمكنك مزجه مع مُحدِّدات أخرى — $.store.book[*]['title','price'] يسحب عنوان وسعر كل كتاب. الاتحادات مفيدة حين تريد إسقاطًا ثابتًا لبضعة حقول بدلًا من كائن كامل أو حرف بدل. وعرض Both هو أوضح طريقة لقراءة نتيجة اتحاد لأنه يقرن كل قيمة مُختارة بمسارها المُطبَّع، فتعرف أي اسم أو فهرس أنتج كل مُدخَل.
هل يمكنني مشاركة استعلام JSONPath وبياناته عبر رابط؟
نعم — والرابط لا يتضمّن أي رحلة إلى الخادم. انقر Copy link في شريط الإجراءات: يُرمِّز المختبِر JSON والتعبير والمحرّك النشط وعرض النتيجة داخل جزء hash من العنوان. من يفتح الرابط تُحقَن صفحته بالحالة نفسها، محليًا على جهازه. ولأن البيانات تعيش في جزء hash، فهي لا تُرسَل قط إلى خادم go-tools.org — فالمتصفّحات لا ترسل الجزء في طلبات HTTP — ولا تظهر أبدًا في سجلات الوصول لدينا. ويزداد طول الرابط مع حجم JSON، لذا في المستندات الكبيرة شارك التعبير فقط ودع المستلِم يلصق بياناته، أو استخدم زر Upload لتحميل ملف محليًا. هذا يجعل الروابط الدائمة آمنة للتنقيح التعاوني دون كشف الحمولة لأي خلفية.
هل هناك حد أقصى لحجم JSON؟
التقييم محدود بذاكرة متصفّحك لا بسقف صارم، لكن النطاق العملي الأمثل مستندات حتى بضعة ميغابايت — أكبر بكثير من أي استجابة API مفردة تقريبًا. المصفوفات الكبيرة جدًا مع مُحدِّدات واسعة (حرف بدل تعاودي $..* فوق عشرات الآلاف من العقد) ستُنتج مجموعة نتائج كبيرة يطول عرضها؛ ضيّق التعبير لإبقاء المخرَج قابلًا للقراءة. ويقرأ زر Upload ملف .json أو .txt كاملًا في المتصفّح (ولا يُرسَل قط)، ويعيد Format JSON تنسيق المُدخَل كي تقرأ البنية قبل الاستعلام. أما لخطوط أنابيب البيانات متعددة الميغابايت، فتحقّق من تعبيرك هنا على شريحة تمثيلية، ثم شغّل المسار نفسه في شِفرة تطبيقك أو في أداة سطر أوامر مثل jq.
كيف يختلف هذا عن jsonpath.com وهل هو آمن — بلا eval؟
أربعة فروق. (1) الخصوصية: تعمل jsonpath.com ومعظم المُقيّمات على خادم أو تضمّن مكتبة تُقيّم الترشيحات بـ eval في JavaScript؛ بينما تعمل هذه الأداة كليًا في متصفّحك ولا تستخدم eval إطلاقًا. المحرّك الافتراضي RFC 9535 تطبيق بلا تبعيات وبلا مسار eval، والمحرّك الكلاسيكي (Goessner) مبني على jsonpath-plus مثبّت على إصدار مُصحَّح مع تعطيل eval صراحةً — مما يُغلق صنف ثغرات تنفيذ الشِفرة عن بُعد المتتبَّع كـ CVE-2024-21534 وCVE-2025-1302. وهذا يعني أيضًا أن الأداة تعمل ضمن سياسة أمان محتوى صارمة. (2) المعايير: هذه واحدة من المختبِرات القليلة عبر الإنترنت التي تقدّم محرّك RFC 9535 حقيقيًا، لا لهجة Goessner القديمة فحسب. (3) المحرّكان: يمكنك التبديل بين RFC 9535 والكلاسيكي لمقارنة النتائج أو لتشغيل تعبيرات منسوخة من أدوات أقدم جنبًا إلى جنب. (4) اللغات: الواجهة متاحة بـ 15 لغة. إن كنت تحتاج فقط فحوصات سريعة للصيغة القديمة، فما زالت jsonpath.com تعمل؛ أما للتقييم المتوافق مع المعايير والخاص وبلا eval، فهذا هو الخيار الأكثر أمانًا.
ماذا تعرض عروض القيم والمسارات وكليهما؟
نتيجة استعلام JSONPath هي قائمة عقد — مجموعة عقد داخل مستندك. عرض القيم يُصيّر تلك العقد كمصفوفة JSON من القيم المطابِقة، تمامًا كما تستهلكها في الشِفرة. وعرض المسارات يُصيّر بدلًا منها المسار المُطبَّع لكل مطابقة — موقعًا قانونيًا بأقواس مقتبسة مثل $['store']['book'][0]['title'] يحدّد بشكل فريد أين تعيش القيمة في المستند، بصرف النظر عن كيفية كتابة تعبيرك. المسارات المُطبَّعة مفهوم من RFC 9535 ولا يُقدَّر بثمن للتنقيح: تعبيران مختلفان يختاران العقدة نفسها يُنتجان المسار المُطبَّع نفسه. وعرض Both يُظهر الاثنين جنبًا إلى جنب كي تطابِق كل قيمة بموقعها بنظرة واحدة. ويستمر عرضك المختار عبر الجلسات بفضل localStorage.
هل يعمل دون اتصال، وماذا عن سياسة أمان المحتوى؟
نعم في الحالتين. لأن كل تقييم يجري في متصفّحك دون نداءات شبكة، تظل الأداة تعمل بعد تحميل الصفحة حتى لو انقطع اتصالك. ولأن أيًّا من المحرّكين لا يستخدم eval أو باني Function لتقييم تعبيرات الترشيح، تعمل الأداة ضمن سياسة أمان محتوى صارمة تمنع unsafe-eval — السياسة التي تفرضها كثير من المؤسسات المهتمة بالأمن والتي تُعطِّل مكتبات JSONPath القائمة على eval. يحلّل محرّك RFC 9535 التعبيرات ويُفسّرها بقواعده الخاصة بدلًا من ترجمتها إلى JavaScript، والمحرّك الكلاسيكي مُهيّأ مع تعطيل eval. إن احتجت إلى تقييم JSONPath داخل بيئة داخلية مُحصَّنة، فهذه الأداة مصمّمة لتعمل هناك دون استثناءات للسياسة.

أدوات ذات صلة

عرض جميع الأدوات →

محوّل 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% بلا رفع.