JSONPath أم JSON Pointer
الخلاصة: JSON Pointer عنوان فريد يمكنك تخزينه كمفتاح؛ JSONPath لغة استعلام. استخدام الخاطئ منهما يكسر تحديثات التهيئة أو يعيد اختراع JSONPath معطوب.

الخلاصة: استخدم JSON Pointer عندما تحتاج إلى قراءة أو كتابة أو تخزين عنوان عقدة واحدة (مثل /server/cors/0)، وJSONPath عندما تحتاج إلى اختيار مجموعة عقد وفق شرط؛ وأي مسار يُحفظ يجب أن يكون Pointer، لا تعبيرًا.
اسأل نفسك: هل تحتاج عقدة واحدة أم مجموعة منها.
في جدول واحد
| JSON Pointer | JSONPath | |
|---|---|---|
| الطبيعة | عنوان فريد | تعبير استعلام |
| الصياغة | /a/b/0 |
$.a.b[0], $..price |
| النتيجة | عقدة واحدة بالضبط، أو لا شيء | صفر أو أكثر من العقد |
| قابل للتخزين كمفتاح | نعم، السلسلة هي الهوية | لا، قد تطابق عدة عقد |
| المعيار | RFC 6901 | RFC 9535 (صدر نهائيًا في 2024) |
JSON Pointer
/server/host -> "127.0.0.1"
/server/cors/0 -> "https://a.com"
/ -> the whole document
المفاتيح التي تحتوي على / أو ~ تُهرَّب: ~0 مقابل ~، و~1 مقابل /. والقيمة هنا هي الحتمية: العنوان سلسلة نصية، لذا يتسع لعمود في قاعدة بيانات أو سطر في سجل أو مفتاح تهيئة. ويعنون JSON Patch (RFC 6902) كل عملية بهذه الطريقة.
JSONPath
$.store.book[*].author
$..price
$.store.book[?(@.price < 10)]
أقرب إلى WHERE في SQL. التعبير نفسه يعيد صفرًا أو عقدة أو مئة عقدة بحسب البيانات.
نمطان من الفشل
استخدام JSONPath كمفتاح تهيئة. خزّن $.server.port وفي يوم ما تصير البنية مصفوفة؛ حينها يطابق التعبير عدة منافذ ولا يجد منطق التحديث طريقة للاختيار.
استخدام Pointer للاختيار. «ابحث عن كل عقدة سعرها أقل من 10» مستحيل بـpointer. وكتابة الحلقة بنفسك تعني بناء JSONPath جزئي.
كيف توزع الأنظمة الحقيقية العمل
- قراءات التهيئة وتحديثات الحقول والتصحيحات: Pointer، ثابت وقابل للتدقيق
- استكشاف البيانات والاستخراج الكمي والتقارير: JSONPath، التعبيرية أولًا
- كل ما يُحفظ: Pointer فقط، ولا تعبير أبدًا
الأسئلة الشائعة
كيف أختار بين JSON Pointer وJSONPath؟
اسأل نفسك: هل تحتاج عقدة أم مجموعة. استخدم JSON Pointer لقراءة أو كتابة عقدة محددة واحدة ولتخزين ذلك العنوان كمفتاح، لأن المؤشر فريد، مثل /server/cors/0. واستخدم JSONPath لاختيار العقد وفق شرط، مثل $.store.book[?(@.price < 10)].
لماذا لا يمكن استخدام تعبير JSONPath كمفتاح تهيئة؟
لأن التعبير قد يطابق عدة عقد. خزّن $.server.port وفي يوم ما تصير البنية مصفوفة؛ حينها يطابق التعبير عدة منافذ ولا يستطيع منطق التحديث تحديد أيها يجب تغييره. وكل ما يُحفظ أو يُدقق يحتاج إلى Pointer.
هل يمكن لـJSON Pointer تصفية العقد وفق شرط؟
لا. يمشي المؤشر فقط في مسار ثابت ولا سبيل له لمعرفة أي العقد موجودة، لذا اختيار كل عقدة سعرها أقل من 10 مستحيل. وكتابة تلك الحلقة بنفسك تعني بناء JSONPath جزئي.