היום למדתי: שליפת מידע מ JSON באמצעות JSON-ptr
את xpath אני מכיר הרבה זמן אבל רק היום גיליתי שיש לו מקבילה וותיקה שתעזור לנו למשוך מידע בקלות מאוביקטי JSON. זה נקרא jsonptr וכבר יש עבורו מסמך איפיון של IETF שנקרא rfc6901 ומספר מימושים ב JavaScript ובשפות אחרות. בואו נראה איך זה עובד.
1. למה צריך למשוך מידע מ JSON
נתון אוביקט ה JSON הבא:
const data = {
items: [ 'one', 'two', 'three' ],
colors: [
{ name: 'red', score: 7 },
{ name: 'blue', score: 9 },
{ name: 'green', score: 15 },
],
};
ואנחנו רוצים לגלות מה השם של הצבע הראשון. ביום רגיל היינו יכולים לכתוב את קוד ה JavaScript הבא:
data.colors[0].name;
אבל:
הקוד יישבר אם מבנה האוביקט שונה
נדרש שינוי קוד כל פעם שמשנים את מבנה האוביקט.
2. איך JSON ptr עוזר לפתור את הבעיה
האיפיון של JSON Ptr הוא מאוד פשוט: אנחנו מעבירים לו מחרוזת שמייצגת נתיב בתוך ה JSON והוא מחזיר לנו את הערך שנמצא שם. זה קצת כמו XPath רק בלי כל היכולות השוות. הקוד הבא משתמש בספריית json-ptr כדי למשוך את השם של הצבע הראשון מאוביקט המידע:
import { JsonPointer } from "json-ptr";
const ptr = JsonPointer.create("/colors/0/name");
const name = ptr.get(data);
אז נכון אפשר היה לשמור כל מחרוזת בתור "נתיב" ולכתוב בעצמנו את הקוד שמחפש באוביקט או להשתמש בספריה כמו object-dig כדי לקבל את אותה תוצאה, אבל בכל זאת זה נחמד שהמחרוזת שלנו כתובה לפי תקן ושיהיה אפשר בקלות להחליף מימוש.
3. מה עושים עם זה בחיים האמיתיים
מנגנון של גישה לערך ב JSON לפי ייצוג מחרוזתי של הנתיב אליו יכול לעזור לנו במקרים הבאים:
כשה API שלי צריך לתמוך במספר מבנים של אוביקטים (למשל אחרי שינוי גירסה), אני יכול לשמור את הנתיב המתאים לכל גירסה וכך פונקציית הטיפול בשרת יכולה להתמודד עם אוביקטים משני הסוגים בצורה גנרית.
כשאני רוצה לאפשר למשתמשים לבחור ערכים מסוימים ב JSON ואני רוצה לשמור (בשרת או ב local storage) את הבחירה שלהם, כך שגם אם ה JSON ישתנה הבחירה תתעדכן בהתאם.