Дозволити лише властивості, які оголошені у схемі JSON


83

Я використовую json-schema і хочу дозволити лише властивостям, оголошеним у цьому файлі, проходити перевірку. Наприклад, якщо користувач передає властивість "name" у своєму json-об'єкті, ця схема не вдасться здійснити, оскільки "name" тут не вказано як властивість.

Чи існує якась функція, подібна до "обов'язкової", яка дозволить лише передати перелічені властивості?

{
"$schema": "http://json-schema.org/draft-04/schema#",
"title": "Accounting Resource - Add Item",
"type": "object",
"properties": {
    "itemNumber": {
        "type":"string",
        "minimum": 3
    },
    "title": {
        "type":"string",
        "minimum": 5
    },
    "description": {
        "type":"string",
        "minimum": 5
    }
},
"required": [
    "itemNumber",
    "title",
    "description"
]
}

2
Навіть якщо є спосіб, це здається схожим на розтяжність у нозі в майбутньому.
Chris Pitman

9
Будь-коли в майбутньому я просто додаю ці властивості до цієї схеми.
ipengineer

1
@ipengineer - це працює (-ish) до тих пір, поки ти є людиною, яка робить розширення. Це також означає, що ви змінюєте ресурс, який деякі люди можуть вважати статичним.
cloudfeet

11
У цьому немає "-ish". Не складно додати нові властивості до вашої схеми, якщо ваш API почне приймати нові реквізити в майбутньому, незалежно від розміру вашої команди. Якщо це так, ви, мабуть, робите щось інше неправильно.
AJB

Відповіді:



6

FYI - схоже, v5 стандарту описує режим перевірки "заборони невідомих властивостей" .

Тож замість того, щоб робити цю вимогу частиною формату (що, як говорить Кріс Пітман у коментарях, пошкоджує розширюваність у майбутньому), ви можете просто доручити валідатору позначити невідомі властивості як помилки. Отже, це як надзвичайно жорсткий режим перевірки, який корисний для розробників.

Деякі валідатори вже підтримують це (наприклад, tv4 ):

var result = tv4.validateMultiple(data, schema, checkRecursive, banUnknownProperties);

За допомогою цього інструменту checkRecursiveслід використовувати, якщо ваші дані можуть мати кругові посилання, і banUnknownPropertiesробитимуть саме те , що ви хочете, без необхідності використовувати "additionalProperties":false.


3

Всередині вашого визначення надайте:

  • всі обов’язкові поля всередині "required": []
  • і встановити "additionalProperties": false

ДЕМО:

без "additionalProperties": false: введіть тут опис зображення

з "additionalProperties": false: введіть тут опис зображення

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.