JSON Toolkit

draft-07 או 2020-12

שורה תחתונה: 2020-12 הוא העדכני ומוסיף `$defs`, `prefixItems` ו-`unevaluatedProperties`, אבל כלים רבים עדיין מדברים רק draft-07. בחרו לפי מה שכל שרשרת הכלים שלכם תומכת בו.

מתקדםכ-4 דקות קריאהפורסם 2026-10-30עודכן 2026-10-30
הבדלים בין drafts של JSON Schema ואיך לבחור

שורה תחתונה: השתמשו ב-2020-12 לפרויקטים חדשים, חזרו ל-draft-07 ברגע שמאמת, מחולל קוד או כלי OpenAPI תומך רק בו, ותמיד נעלו את ה-draft עם $schema.

תשובה קצרה: 2020-12 לעבודה חדשה, draft-07 כשרכיב ישן מכריח.

ציר זמן

Draft שנה בולט
draft-04 2013 id במקום $id; עדיין נפוץ ב-API ישנים
draft-06 2017 const, propertyNames
draft-07 2018 if/then/else, readOnly, contentMediaType; התאימות הטובה ביותר
2019-09 2019 $defs מחליף את definitions, unevaluatedProperties
2020-12 2020 prefixItems, $dynamicRef; ההמלצה העדכנית

מה 2020-12 משפר

מערכים מסוג tuple מפסיקים להיות מקרה מיוחד. draft-07 מבטא "האיבר הראשון הוא A, השני הוא B" עם items: [{...}, {...}] ועוד additionalItems. 2020-12 משתמש ב-prefixItems עבור סכמות תלויות-מיקום וב-items לכל השאר.

$defs הוא השם התקני. כלים שנכתבו אחרי 2019 מחפשים שם כברירת מחדל.

unevaluatedProperties עובד עם הרכבה. עם allOf, ‏additionalProperties: false דוחה שדות שמוגדרים בענפים אחים. unevaluatedProperties: false מתחשב רק במאפיינים שהוערכו בפועל על ידי הסכימה כולה, וזה מה שהרכבה צריכה.

מתי draft-07 הוא התשובה הנכונה

מצב סיבה
OpenAPI 3.0 אובייקט הסכמה שלו הוא תת-קבוצה של draft-04/07
מאמתים ישנים (ajv 6, כמה ספריות Java) הם לא מכירים prefixItems או $dynamicRef
פלטפורמה מחייבת גרסה כמה פלטפורמות low-code ו-gateways נועלות אותה
מחוללי קוד שעוצרים ב-07 מילות מפתח לא מוכרות מותעלמות בשקט

בדקו את המקרה האחרון ישירות: האכילו את המאמת בסכמה שמשתמשת ב-prefixItems. אם היא עוברת בלי תלונה במקום לדווח על מילת מפתח לא מוכרת, הוא מתעלם מהאילוץ — התוצאה המסוכנת מכולן.

ערבוב גרסאות

תמיד הצהירו על $schema. ברירות המחדל שונות: ajv מניח draft-07, כמה ספריות Python מניחות 2020-12. אותו קובץ אז עובר אימות אחר בשני מקומות.

{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id": "https://example.com/schemas/order.json",
  "type": "object"
}

אל תעשו $ref בין drafts. ההתנהגות אינה מוגדרת.

שדרגו בקבוצות. שני drafts במאגר אחד הופכים את "אילו כללים חלים כאן" לידע שבשפה.

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

איך בודקים אם המאמת שלי תומך ב-2020-12?

האכילו את המאמת בסכמה שמשתמשת ב-prefixItems. שגיאת מילת מפתח לא מוכרת פירושה שהוא לא תומך ב-draft; מעבר בשקט פירושו שהוא מתעלם מהאילוץ, וזה גרוע יותר.

למה פרויקט אחד צריך להשתמש ב-draft אחד בלבד?

שני drafts במאגר אחד הופכים את "אילו כללים חלים כאן" לידע שבשפה. שדרגו בקבוצות כך שכל קובץ חולק את אותה פרשנות.

האם תמיד צריך להצהיר על $schema?

כן. ברירות המחדל שונות: ajv מניח draft-07 בעוד כמה ספריות Python מניחות 2020-12, כך שאותו קובץ יכול לעבור אימות אחר בשני מקומות.

קריאה נוספת