JSON模式-实例除了模式中声明的字段外没有其他字段

时间:2019-02-14 10:34:00

标签: json jsonschema json-schema-validator

我试图找出是否有一种方法可以验证特定的JSON实例在架构中声明的字段之外没有其他字段。

让我们以这种模式为例:

{
    "$schema": "http://json-schema.org/draft-07/schema#",
    "title": "Client",
    "type": "object",
    "properties": {
        "name": {
            "type": "string"
        },
        "email": {
            "type": "string"
        },
        "isActive": {
            "type": "boolean"
        }
    },
    "required": []
}

我想强制执行此“类型”的任何JSON只能具有名称,电子邮件和isActive。如果以下JSON验证成功,我希望验证失败:

{
   "name": "John",
   "email": "john@example.com",
   "isActive": true,
   "extrafield": 123
}

我正在使用json-schema-validator来执行验证,但是我感觉到,不仅仅是我使用的特定验证器存在实现问题/假设,我的JSON模式并未强制阻止未定义字段。

我该如何实现? 谢谢

1 个答案:

答案 0 :(得分:1)

您要寻找的是additionalProperties

  

“ additionalProperties”的值必须是有效的JSON模式。

     

此关键字确定子实例如何验证对象,   并且不会直接验证即时实例本身。

     

具有“ additionalProperties”的验证仅适用于子对象
  与“属性”中的任何名称都不匹配的实例名称的值,   并且不匹配“ patternProperties”中的任何正则表达式。

     

对于所有此类属性,如果子实例实例验证成功,   根据“ additionalProperties”架构进行验证。

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

要翻译:{{1​​}}中的键值(即模式)将应用于键值实例的对象。

实例对象的所有未经properties验证(也未经properties验证)的属性,都由patternProperties求值。

任何架构的值都可以为additionalProperties,这会导致验证失败,因此您想向架构中添加false

但是请注意,additionalProperties: false无法“透视”其他应用程序关键字,例如additionalProperties,并且仅适用于oneOfproperties

(草案8将引入一个新的关键字patternProperties,以提供此功能,但该版本目前尚未发布)。