Как предотвратить определенные поля на основе значения другого поля с помощью валидатора JSON Schema - PullRequest
0 голосов
/ 09 октября 2018

В зависимости от salaryRange, который выбирает пользователь, мне нужно проверять по-разному, требуя одни поля и отклоняя другие.Я чувствую, что это комбинация allOf и нет, но я, кажется, не совсем понимаю.

Сценарий # 1

Пользователь выбирает salaryRange (Hourly)

  • Требуется hourlyRate

  • Запретить заполнение полей feeOne и feeTwo

Сценарий # 2

Пользователь выбирает salaryRange (0-50k ИЛИ 50-100k)

  • Требуется feeOne и feeTwo

  • Preventпредставление поля hourlyRate

Вот моя схема

{
  "schema": "http://json-schema.org/draft-04/schema#",
  "$id": "http://mysite/schemas/job.json#",
  "title": "Job",
  "description": "Create job",
  "type": "object",
  "properties": {
    "title": { "type": "string" },
    "description": { "type": "string" },
    "salaryRange": { "enum": ["0-50k", "50-100k", "100-150k", "150-200k", "200-300k", "300k+", "nonExempt", "Hourly"] },  
    "hourlyRate": { 
      "type": "number",
      "minimum": 0,
      "maximum": 300 
    },
    "feeOne": { 
      "type": "number", 
      "minimum": 0 
    },
    "feeTwo": { 
      "type": "number", 
      "minimum": 0 
    }
  }    ,
  "additionalProperties": false,  
  "required": [
    "title", 
    "description", 
    "salaryRange"
  ]
}

1 Ответ

0 голосов
/ 11 октября 2018

Вы можете использовать oneOf и not required для моделирования всех возможных комбинаций.

Вот пример в js: https://runkit.com/embed/cf8cra1mwvx3/

{
  "schema": "http://json-schema.org/draft-04/schema#",
  "$id": "http://mysite/schemas/job.json#",
  "title": "Job",
  "description": "Create job",
  "type": "object",
  "properties": {
    "title": { "type": "string" },
    "description": { "type": "string" },
    "salaryRange": { "enum": ["0-50k", "50-100k", "100-150k", "150-200k", "200-300k", "300k+", "nonExempt", "Hourly"] },  
    "hourlyRate": { 
      "type": "number",
      "minimum": 0,
      "maximum": 300 
    },
    "feeOne": { 
      "type": "number", 
      "minimum": 0 
    },
    "feeTwo": { 
      "type": "number", 
      "minimum": 0 
    }
  },
  "oneOf": [
    {
        "description": "Disallow fees for hourly salary",
        "properties": {
            "salaryRange": { "enum": ["Hourly"] }
        },
        "required": ["hourlyRate"],
        "allOf": [
            {"not":{"required":["feeOne"]}},
            {"not":{"required":["feeTwo"]}}
        ]
    },
    {
        "description": "Disallow hourly rate for 0-50k, 50-100k salaries",
        "properties": {
            "salaryRange": { "enum": ["0-50k", "50-100k"] }
        },
        "required": ["feeOne", "feeTwo"],
        "not":{"required":["hourlyRate"]}
    },
    {
        "description": "Allow other cases",
         "properties": {
            "salaryRange": { "not" : {"enum": ["Hourly", "0-50k", "50-100k"] } }
        }
    }
  ],
  "additionalProperties": false,  
  "required": [
    "title", 
    "description", 
    "salaryRange"
  ]
}
...