JSON Toolkit

JSONPath או JSON Pointer

שורה תחתונה: JSON Pointer הוא כתובת ייחודית שאפשר לאחסן כמפתח; JSONPath היא שפת שאילתות. בחירה בדבר הלא נכון שוברת עדכוני קונפיגורציה או ממציאה JSONPath שבור.

בינוניכ-4 דקות קריאהפורסם 2026-10-30עודכן 2026-10-30
היכן JSONPath נגמר ו-JSON Pointer מתחיל

שורה תחתונה: השתמשו ב-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

מפתחות שמכילים / או ~ עוברים escaping: ~0 עבור ~, ~1 עבור /. הערך הוא דטרמיניזם: הכתובת היא מחרוזת, כך שהיא מתאימה לעמודת מסד נתונים, לשורת לוג או למפתח קונפיגורציה. JSON Patch (RFC 6902) מפנה כל פעולה בדרך זו.

JSONPath

$.store.book[*].author
$..price
$.store.book[?(@.price < 10)]

קרוב יותר ל-WHERE של SQL. אותו ביטוי מחזיר אפס, אחד או מאה צמתים בהתאם לנתונים.

שני מצבי כשל

שימוש ב-JSONPath כמפתח קונפיגורציה. אחסנו $.server.port ויום אחד המבנה הופך למערך; הביטוי מתאים כעת לכמה ports וללוגיקת העדכון אין דרך לבחור.

שימוש ב-Pointer לבחירה. "מצאו כל צומת שמחירו מתחת ל-10" בלתי אפשרי עם pointer. לכתוב את הלולאה בעצמכם פירושו לבנות JSONPath חלקי.

איך מערכות אמיתיות מחלקות את העבודה

  • קריאת קונפיגורציה, עדכוני שדות, patches: Pointer, קבוע וניתן לביקורת
  • חקר נתונים, חילוץ גורפ, דוחות: JSONPath, כושר ביטוי קודם
  • כל דבר שנשמר: Pointer בלבד, לעולם לא ביטוי

שאלות ותשובות

איך לבחור בין JSON Pointer ל-JSONPath?

שאלו אם צריך צומת אחד או קבוצה. השתמשו ב-JSON Pointer כדי לקרוא או לכתוב צומת ספציפי אחד וכדי לאחסן את הכתובת כמפתח, כי ה-pointer ייחודי, למשל /server/cors/0. השתמשו ב-JSONPath כדי לבחור צמתים לפי תנאי, למשל $.store.book[?(@.price < 10)].

למה אי אפשר להשתמש בביטוי JSONPath כמפתח קונפיגורציה?

כי הביטוי עשוי להתאים לכמה צמתים. אחסנו $.server.port ויום אחד המבנה הופך למערך; הביטוי מתאים אז לכמה ports וללוגיקת העדכון אין דרך להחליט מה לשנות. כל דבר שנשמר או נבדק צריך Pointer.

האם JSON Pointer יכול לסנן צמתים לפי תנאי?

לא. pointer רק הולך בנתיב קבוע ואין לו דרך לדעת אילו צמתים קיימים, כך שבחירת כל צומת שמחירו מתחת ל-10 בלתי אפשרית. לכתוב את הלולאה בעצמכם פירושו לבנות JSONPath חלקי.

קריאה נוספת