如何使用JSON模式验证器防止基于其他字段值的某些字段

时间:2018-10-09 18:46:18

标签: jsonschema json-schema-validator

根据用户选择的薪金范围,我需要通过要求某些字段并拒绝其他字段来进行不同的验证。我觉得它是allOf和notAll的结合,但我似乎不太明白。

场景1

用户选择薪水范围(小时)

  • 需要hourlyRate

  • 防止提交字段feeOne和feeTwo

场景#2

用户选择薪水范围(0-50k或50-100k)

  • 需要feeOne和feeTwo

  • 防止字段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 :(得分:1)

您可以使用oneOfnot 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"
  ]
}