如何使用JSON模式有条件地指定默认值

时间:2018-10-25 15:25:39

标签: jsonschema json-schema-validator json-schema-defaults

我有一个字段状态

如果用户将作业设置为草稿状态,则不需要描述字段-但我希望默认值为空字符串。

如果用户发布的作业超出了我想要的描述。

我不知道是如何在“ oneOf-草稿”数组中为说明设置默认值的。

这是我的模式

{
  "schema": "http://json-schema.org/draft-04/schema#",
  "$id": "http://company.com/schemas/job-update.json#",
  "title": "Job",
  "description": "Update job",
  "type": "object",
  "properties": {
    "title": { 
      "type": "string",
      "minLength": 2
    },
    "description": { 
      "type": "string"
     // Can't set default here - as it will apply for the publish status.
    },    
    "status": { 
      "enum": ["draft", "published", "onhold"],
      "default": "draft"
    }
  },
  "oneOf": [
        {
          "description": "Draft jobs do not require any validation",
          "properties": {
            "status": { "enum": ["draft"]}
          },
          "required": [] 
          // SOME WHERE HERE SET DESCRIPTION.default: ""         
        },
        {
          "description": "Published jobs require validation on required fields",
          "properties": {
            "status": { "enum": ["published"]}
          },
          "required": [
            "description"
          ], 
        }        
  ],
  "additionalProperties": false
}

1 个答案:

答案 0 :(得分:0)

不幸的是,使用纯JSON模式无法做到这一点。

JSON模式验证不会修改实例数据。

JSON模式中的default关键字是注释关键字。 注释关键字用于表示信息,但是它们没有验证要求。

草稿7(当前)说:

  

此关键字的值没有限制。什么时候   此关键字的多次出现适用于单个   子实例,实现应删除重复项。

     

此关键字可用于提供关联的默认JSON值   具有特定的架构。建议默认值为   对关联的模式有效。

https://tools.ietf.org/html/draft-handrews-json-schema-validation-01#section-10.2

没有与注释关键字相关的已定义行为。

请记住,JSON模式的主要用例是定义,验证和注释。

但是...

如果您不关心模式的可移植性,则ajv实现允许您在验证过程中使用default值来设置密钥,但是JSON Schema并未定义此行为。