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 (نهاییشده ۲۰۲۴) |
JSON Pointer
/server/host -> "127.0.0.1"
/server/cors/0 -> "https://a.com"
/ -> the whole document
کلیدهای شامل / یا ~ escape میشوند: ~0 برای ~، ~1 برای /. ارزشش قطعیت است: آدرس یک رشته است، پس در ستون پایگاهداده، خط لاگ یا کلید پیکربندی جا میشود. JSON Patch (RFC 6902) هر عملیات را اینگونه آدرسدهی میکند.
JSONPath
$.store.book[*].author
$..price
$.store.book[?(@.price < 10)]
نزدیکتر به WHERE در SQL. همان عبارت بسته به داده صفر، یک یا صد گره برمیگرداند.
دو حالت شکست
استفاده از JSONPath بهعنوان کلید پیکربندی. $.server.port را ذخیره کنید و روزی ساختار به آرایه تبدیل شود؛ عبارت اکنون چند port را تطبیق میدهد و منطق بهروزرسانی هیچ راهی برای انتخاب ندارد.
استفاده از Pointer برای انتخاب. «هر گرهای که قیمتش زیر ۱۰ است را پیدا کن» با pointer ممکن نیست. نوشتن خود حلقه یعنی ساختن یک JSONPath ناقص.
سیستمهای واقعی چگونه کار را تقسیم میکنند
- خواندن پیکربندی، بهروزرسانی فیلد، patch: Pointer، ثابت و قابل حسابرسی
- کاوش داده، استخراج انبوه، گزارشگیری: JSONPath، بیانگری اول
- هر چیز ماندگار: فقط Pointer، هرگز یک عبارت
پرسشهای متداول
چگونه بین JSON Pointer و JSONPath انتخاب کنم؟
بپرسید به یک گره نیاز دارید یا مجموعهای. از JSON Pointer برای خواندن یا نوشتن یک گره مشخص و ذخیره آن آدرس بهعنوان کلید استفاده کنید، چون pointer یکتاست، مثلاً /server/cors/0. از JSONPath برای انتخاب گرهها بر اساس شرط استفاده کنید، مثلاً $.store.book[?(@.price < 10)].
چرا عبارت JSONPath نمیتواند بهعنوان کلید پیکربندی استفاده شود؟
چون عبارت ممکن است چند گره را تطبیق دهد. $.server.port را ذخیره کنید و روزی ساختار به آرایه تبدیل شود؛ عبارت آنگاه چند port را تطبیق میدهد و منطق بهروزرسانی نمیتواند تصمیم بگیرد کدام را تغییر دهد. هر چیز ماندگار یا حسابرسیشده به Pointer نیاز دارد.
آیا JSON Pointer میتواند گرهها را بر اساس شرط فیلتر کند؟
نه. pointer فقط مسیری ثابت را طی میکند و راهی برای دانستن اینکه کدام گرهها وجود دارند ندارد، پس انتخاب هر گرهای که قیمتش زیر ۱۰ است ممکن نیست. نوشتن آن حلقه یعنی ساختن یک JSONPath ناقص.