JSON Diff: השוואת אובייקטי JSON
הדביקו שני מסמכי JSON כדי לראות בדיוק מה השתנה. כל הבדל מופיע לפי הנתיב שלו, כמו $.users[2].email, ועיצוב או סדר מפתחות לעולם לא גורמים להתרעות שווא.
רץ בדפדפן שלכםבלי הרשמהשום דבר לא מועלה
נתיבים שהשתנו
| שינוי | נתיב | ערך ישן | ערך חדש |
|---|
איך משתמשים בכלי השוואת JSON
- הדביקו את ה-JSON המקורי בתיבה הראשונה ואת ה-JSON ששונה בתיבה השנייה, או פתחו שני קבצים.
- שגיאות תחביר מוצגות מתחת לכל תיבה עם השורה והעמודה, כך שאפשר לתקן אותן במהירות.
- קראו את טבלת הנתיבים שהשתנו: כל שורה מציינת אם ערך נוסף, הוסר או השתנה, עם הערך הישן והחדש.
- סמנו התעלמות מסדר מערכים כשהרשימות הן קבוצות, למשל תגיות או הרשאות.
- גללו לתצוגה זה לצד זה כדי לראות את השינויים בהקשר, או העתיקו את רשימת השינויים כ-JSON.
למה השוואה מבנית של JSON עדיפה על השוואת טקסט
השוואת טקסט רגילה משווה תווים ושורות, ולכן שני קובצי JSON שמכילים את אותם נתונים יכולים להיראות שונים לגמרי אם אחד מכווץ, מוזח אחרת או שהמפתחות בו בסדר אחר. הכלי הזה מנתח קודם את שני המסמכים ומשווה את הנתונים: אובייקטים מושווים מפתח אחר מפתח בלי קשר לסדר, ומספרים, מחרוזות, ערכים בוליאניים ו-null מושווים לפי ערך. רק שינויים אמיתיים מדווחים.
איך השינויים מדווחים
כל הבדל מקבל מיקום בסגנון JSONPath, כמו $.owner.email או $.items[3].price, ואחד משלושה סוגים:
- נוסף: המפתח או איבר המערך קיימים רק ב-JSON ששונה.
- הוסר: הוא קיים רק ב-JSON המקורי.
- השתנה: הוא קיים בשניהם אבל הערך שונה, כולל שינויי טיפוס, כמו מחרוזת שהפכה למספר.
מערכים מיושרים באמצעות אלגוריתם תת-הסדרה המשותפת הארוכה ביותר (LCS), כך שהוספת איבר אחד בתחילת רשימה מדווחת כהוספה יחידה, במקום לסמן כל איבר שאחריו כמשתנה.
התעלמות מסדר מערכים
ממשקי API רבים מחזירים רשימות שלסדר שלהן אין משמעות, כמו תפקידים, תגיות או מזהים. כאשר התעלמות מסדר מערכים מופעלת, מערכים מושווים כאוספים: איבר נחשב לנוסף או להוסר רק אם אין לו מקבילה שווה בצד השני. התצוגה זה לצד זה ממיינת אז את איברי המערך כך שרשימות שוות מתיישרות.
שימושים נפוצים
השוואת תגובות API בין staging לפרודקשן, בדיקה מה מיגרציה שינתה בקובץ תצורה, סקירת הבדלים בין שני קובצי package.json או tsconfig, ודיבאג של snapshot tests.
שאלות נפוצות
האם סדר המפתחות משנה בהשוואת JSON?
{"a":1,"b":2} ו-{"b":2,"a":1} מדווחים כשווים. סדר המערכים כן משנה כברירת מחדל, כי מערכים הם מסודרים, אבל אפשר לבטל זאת עם התעלמות מסדר מערכים.האם ה-JSON שלי מועלה לשרת?
מה המשמעות של נתיבים כמו $.users[2].email?
$ הוא שורש המסמך, .users הוא מפתח, ו-[2] הוא האיבר השלישי במערך (האינדקסים מתחילים ב-0). מפתחות עם רווחים או תווים מיוחדים נכתבים בסוגריים מרובעים, כמו $["first name"].האם 1 שווה ל-1.0?
1 ו-"1", שונים ומדווחים כשינוי.