JSON Diff: השוואת אובייקטי JSON

הדביקו שני מסמכי JSON כדי לראות בדיוק מה השתנה. כל הבדל מופיע לפי הנתיב שלו, כמו $.users[2].email, ועיצוב או סדר מפתחות לעולם לא גורמים להתרעות שווא.

רץ בדפדפן שלכםבלי הרשמהשום דבר לא מועלה

תמיד מתעלמים מסדר המפתחות.

איך משתמשים בכלי השוואת JSON

  1. הדביקו את ה-JSON המקורי בתיבה הראשונה ואת ה-JSON ששונה בתיבה השנייה, או פתחו שני קבצים.
  2. שגיאות תחביר מוצגות מתחת לכל תיבה עם השורה והעמודה, כך שאפשר לתקן אותן במהירות.
  3. קראו את טבלת הנתיבים שהשתנו: כל שורה מציינת אם ערך נוסף, הוסר או השתנה, עם הערך הישן והחדש.
  4. סמנו התעלמות מסדר מערכים כשהרשימות הן קבוצות, למשל תגיות או הרשאות.
  5. גללו לתצוגה זה לצד זה כדי לראות את השינויים בהקשר, או העתיקו את רשימת השינויים כ-JSON.

למה השוואה מבנית של JSON עדיפה על השוואת טקסט

השוואת טקסט רגילה משווה תווים ושורות, ולכן שני קובצי JSON שמכילים את אותם נתונים יכולים להיראות שונים לגמרי אם אחד מכווץ, מוזח אחרת או שהמפתחות בו בסדר אחר. הכלי הזה מנתח קודם את שני המסמכים ומשווה את הנתונים: אובייקטים מושווים מפתח אחר מפתח בלי קשר לסדר, ומספרים, מחרוזות, ערכים בוליאניים ו-null מושווים לפי ערך. רק שינויים אמיתיים מדווחים.

איך השינויים מדווחים

כל הבדל מקבל מיקום בסגנון JSONPath, כמו $.owner.email או $.items[3].price, ואחד משלושה סוגים:

  • נוסף: המפתח או איבר המערך קיימים רק ב-JSON ששונה.
  • הוסר: הוא קיים רק ב-JSON המקורי.
  • השתנה: הוא קיים בשניהם אבל הערך שונה, כולל שינויי טיפוס, כמו מחרוזת שהפכה למספר.

מערכים מיושרים באמצעות אלגוריתם תת-הסדרה המשותפת הארוכה ביותר (LCS), כך שהוספת איבר אחד בתחילת רשימה מדווחת כהוספה יחידה, במקום לסמן כל איבר שאחריו כמשתנה.

התעלמות מסדר מערכים

ממשקי API רבים מחזירים רשימות שלסדר שלהן אין משמעות, כמו תפקידים, תגיות או מזהים. כאשר התעלמות מסדר מערכים מופעלת, מערכים מושווים כאוספים: איבר נחשב לנוסף או להוסר רק אם אין לו מקבילה שווה בצד השני. התצוגה זה לצד זה ממיינת אז את איברי המערך כך שרשימות שוות מתיישרות.

שימושים נפוצים

השוואת תגובות API בין staging לפרודקשן, בדיקה מה מיגרציה שינתה בקובץ תצורה, סקירת הבדלים בין שני קובצי package.json או tsconfig, ודיבאג של snapshot tests.

שאלות נפוצות

האם סדר המפתחות משנה בהשוואת JSON?
לא. אובייקטי JSON אינם מסודרים, ולכן {"a":1,"b":2} ו-{"b":2,"a":1} מדווחים כשווים. סדר המערכים כן משנה כברירת מחדל, כי מערכים הם מסודרים, אבל אפשר לבטל זאת עם התעלמות מסדר מערכים.
האם ה-JSON שלי מועלה לשרת?
לא. שני המסמכים מנותחים ומושווים בדפדפן שלכם. שום דבר לא נשלח ברשת, ולכן הכלי בטוח לתגובות API שמכילות טוקנים או נתוני לקוחות.
מה המשמעות של נתיבים כמו $.users[2].email?
$ הוא שורש המסמך, .users הוא מפתח, ו-[2] הוא האיבר השלישי במערך (האינדקסים מתחילים ב-0). מפתחות עם רווחים או תווים מיוחדים נכתבים בסוגריים מרובעים, כמו $["first name"].
האם 1 שווה ל-1.0?
כן. שניהם מתפרשים לאותו מספר, ולכן הם לא מדווחים כהבדל. מספר ומחרוזת, כמו 1 ו-"1", שונים ומדווחים כשינוי.
אפשר להשוות JSON עם הערות או פסיקים מיותרים בסוף?
JSON סטנדרטי לא מתיר אותם, ולכן קלט כזה מסומן עם השורה והעמודה המדויקות. הסירו את ההערות או הפסיקים, או נקו קודם את המסמך במעצב ה-JSON.

כלים קשורים