【问题标题】:How to specify defaults conditionally with JSON Schema如何使用 JSON Schema 有条件地指定默认值
【发布时间】:2018-10-25 15:25:38
【问题描述】:

我有一个字段状态

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

如果用户发布的作业比我想要的描述是必需的。

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

这是我的架构

{
  "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
}

【问题讨论】:

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


    【解决方案1】:

    很遗憾,使用纯 JSON Schema 无法做到这一点。

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

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

    Draft-7(当前版本)是这样说的:

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

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

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

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

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

    但是...

    如果您不关心架构的可移植性,ajv 实现允许您在验证期间使用 default 值设置密钥,但 JSON 架构未定义此行为。

    【讨论】:

    • 嗨@Relequestual - 我实际上正在使用ajv,因此我在其他地方使用了默认值道歉 - 我应该提到这一点 - 对于ajv node.js repo或你知道怎么用ajv做到这一点吗
    • 好的,太好了!听起来这只是一个JSON Schema问题,而不是专门与ajv有关。您能否使用示例 JSON 实例更新您的问题,您希望在其中应用默认值? =]
    • 一些验证器(例如github.com/pboettch/json-schema-validator)返回一个补丁,您可以将其应用于您的文档如果您需要默认值。尊重规范 可以按照通常的预期工作。 :)
    猜你喜欢
    • 1970-01-01
    • 2018-05-01
    • 1970-01-01
    • 2010-09-08
    • 1970-01-01
    • 2012-05-05
    • 1970-01-01
    • 1970-01-01
    • 2010-10-10
    相关资源
    最近更新 更多