2016-08-02 345 views
16

在jsonSchema您可以指明定义字段是否是强制性的或者是不使用“必需的”属性:jsonSchema属性条件必需

{ 
    "$schema": "http://json-schema.org/draft-04/schema#", 
    "type": "object", 
    "properties": { 
     "header": { 
      "type": "object", 
      "properties": { 
       "messageName": { 
        "type": "string" 
       }, 
       "messageVersion": { 
        "type": "string" 
       } 
      }, 
      "required": [ 
       "messageName", 
       "messageVersion" 
      ] 
     } 
    }, 
    "required": [ 
     "header" 
    ] 
} 

在某些情况下,我想messageVersion领域不具有强制性。有没有办法使这个领域的强制性有条件?

+0

是的,应该是可以的。数据中的哪些信息会触发强制性? – jruizaranguren

+0

如何在版本3中执行此操作? –

+0

@SarveswaranMeenakshiSundaram - 我不知道我只使用了v4的json模式 –

回答

41

根据您的情况,有几种不同的方法。我可以想到四种不同的方式来有条件地要求一个领域。

依赖性

dependencies关键字与关键字required的有条件的变化。 Foreach属性dependencies,如果该属性存在于正在验证的JSON中,则与该关键字相关联的模式也必须有效。 如果“foo”的属性存在,那么“栏中的”属性是必需的

{ 
    "type": "object", 
    "properties": { 
    "foo": { "type": "string" }, 
    "bar": { "type": "string" } 
    }, 
    "dependencies": { 
    "foo": { "required": ["bar"] } 
    } 
} 

还有一个短的形式,如果该模式只包含required关键字。

{ 
    "type": "object", 
    "properties": { 
    "foo": { "type": "string" }, 
    "bar": { "type": "string" } 
    }, 
    "dependencies": { 
    "foo": ["bar"] 
    } 
} 

意义

如果你的条件取决于一个字段的值,你可以使用名为蕴涵的布尔逻辑概念。 “A暗示B”实际上意味着,如果A是真的,那么B也必须是真的。含义也可以表示为“!A或B”。 “foo”属性不等于“bar”,或者需要“bar”属性。或者,换句话说:如果“foo”的属性等于“酒吧”,则需要

{ 
    "type": "object", 
    "properties": { 
    "foo": { "type": "string" }, 
    "bar": { "type": "string" } 
    }, 
    "anyOf": [ 
    { 
     "not": { 
     "properties": { 
      "foo": { "enum": ["bar"] } 
     }, 
     "required": ["foo"] 
     } 
    }, 
    { "required": ["bar"] } 
    ] 
} 

的“栏”属性如果“富”不等于“吧”,#/anyOf/0比赛和验证成功。如果“foo”等于“bar”,则#/anyOf/0失败,并且#/anyOf/1必须对anyOf验证有效才能成功。

枚举

如果你的条件是基于一个枚举,这是一个有点更直截了当。 “foo”可以是“bar”或“baz”。如果“foo”等于“bar”,则需要“bar”。如果“foo”等于“baz”,则需要“baz”。

{ 
    "type": "object", 
    "properties": { 
    "foo": { "enum": ["bar", "baz"] }, 
    "bar": { "type": "string" }, 
    "baz": { "type": "string" } 
    }, 
    "anyOf": [ 
    { 
     "properties": { 
     "foo": { "enum": ["bar"] } 
     }, 
     "required": ["bar"] 
    }, 
    { 
     "properties": { 
     "foo": { "enum": ["baz"] } 
     }, 
     "required": ["baz"] 
    } 
    ] 
} 

IF-THEN-ELSE

一个相对较新的JSON模式(草案-07)增加了ifthenelse关键字。 如果 “foo” 的属性等于 “吧”,那么 “栏” 属性是必需的

{ 
    "type": "object", 
    "properties": { 
    "foo": { "type": "string" }, 
    "bar": { "type": "string" } 
    }, 
    "if": { 
    "properties": { 
     "foo": { "enum": ["bar"] } 
    } 
    }, 
    "then": { "required": ["bar"] } 
} 

编辑2017年12月23日:蕴涵部分更新和IF-THEN-ELSE部分加入。

+2

真棒回答,谢谢。这完全解决了我的情况! –

+0

这只是一个有用的参考。每天回来:) – Owen