【问题标题】:Only allow properties that are declared in JSON schema只允许在 JSON 模式中声明的属性
【发布时间】:2013-07-06 00:41:34
【问题描述】:

我正在使用 json-schema 并希望仅允许在此文件中声明的属性通过验证。例如,如果用户在他们的 json 对象中传递了一个“name”属性,那么这个模式就会失败,因为“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"
]
}

【问题讨论】:

  • 即使有办法,这似乎是在脚下射出未来的可扩展性。
  • 未来任何时候我都会将这些属性添加到这个架构中。
  • @ipengineer - 只要 you 是进行扩展的人,它就可以工作(-ish)。这也意味着您更改了某些人可能认为是静态的资源。
  • 这里没有“-ish”。如果您的 API 将来开始接受新的 props,无论您的团队规模如何,向您的架构添加新属性并不难。如果是这样,你可能做错了什么。

标签: json jsonschema


【解决方案1】:

我相信您需要做的就是将additionalProperties 设置为false。见规范here

【讨论】:

【解决方案2】:

仅供参考 - 看起来标准的 v5 将描述 "ban unknown properties" 验证模式。

因此,不要将此要求作为格式的一部分(正如 Chris Pitman 在 cmets 中所说,这会损害未来的可扩展性),您可以简单地指示您的 验证器 将未知属性标记为错误。所以,它就像一个对开发人员有用的超严格验证模式。

一些验证器已经支持这个(例如tv4):

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

使用此工具,如果您的数据可能具有循环引用,则应使用checkRecursive,而banUnknownProperties完全执行您想要的操作,而无需使用"additionalProperties":false

【讨论】:

    【解决方案3】:

    在您的定义中提供:

    • "required": [] 中的所有必填字段
    • 并设置"additionalProperties": false

    演示:

    没有"additionalProperties": false

    "additionalProperties": false:

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-02-25
      • 1970-01-01
      • 2017-10-28
      • 2018-11-30
      • 1970-01-01
      • 2014-02-14
      • 1970-01-01
      相关资源
      最近更新 更多