如何编写支持两个对象和一个布尔值校验的JSON Schema?
首先你原有写法的核心问题有两个:
- 同一个JSON Schema对象中不能重复声明
type、description等同名key,后声明的会直接覆盖前面的定义,完全无法实现多规则校验 - JSON Schema中布尔类型的取值是
boolean,不是bool
接下来根据你实际的校验需求,分两种常见场景给修正代码:
场景1:校验顶层对象包含2个嵌套对象字段+1个布尔字段(最常用场景)
如果你要校验的目标JSON结构如下示例:
{ "firstObject": { "personId": "123456", "code": "abc" }, "secondObject": { "name": "张三张三", "code2": "def" }, "yeahOrNay": true }
对应的C# Schema定义代码如下:
string schemaJson = @"{ 'description': '包含两个对象和一个布尔值的顶层结构校验', 'type': 'object', 'properties': { 'firstObject': { 'description': '第一个嵌套对象', 'type': 'object', 'properties': { 'personId': { 'type': 'string', 'minLength': 6 }, 'code': { 'type': 'string', 'minLength': 3 } }, 'required': [ 'personId', 'code' ] }, 'secondObject': { 'description': '第二个嵌套对象', 'type': 'object', 'properties': { 'name': { 'type': 'string', 'minLength': 6 }, 'code2': { 'type': 'string', 'minLength': 3 } }, 'required': [ 'name', 'code2' ] }, 'yeahOrNay': { 'description': '布尔值字段', 'type': 'boolean' } }, 'required': [ 'firstObject', 'secondObject', 'yeahOrNay' ] }"; JSchema schema = JSchema.Parse(schemaJson);
场景2:校验的目标值可以是「第一个对象/第二个对象/布尔值」三种类型任意一种
如果你的需求是待校验的JSON可以是三种合法形式中的任意一种,使用anyOf关键字实现:
string schemaJson = @"{ 'description': '三种合法类型任意一种的校验', 'anyOf': [ { 'description': '第一个对象', 'type': 'object', 'properties': { 'personId': { 'type': 'string', 'minLength': 6 }, 'code': { 'type': 'string', 'minLength': 3 } }, 'required': [ 'personId', 'code' ] }, { 'description': '第二个对象', 'type': 'object', 'properties': { 'name': { 'type': 'string', 'minLength': 6 }, 'code2': { 'type': 'string', 'minLength': 3 } }, 'required': [ 'name', 'code2' ] }, { 'description': '布尔值', 'type': 'boolean' } ] }"; JSchema schema = JSchema.Parse(schemaJson);
补充:allOf的适用场景
你提到的allOf关键字适用于待校验的对象需要同时满足多个Schema规则的场景,比如同一个对象既要包含personId、code字段,又要包含name、code2字段,就可以把两个对象的Schema放到allOf的数组里。
内容的提问来源于stack exchange,提问作者JoBo
相关产品推荐
相关产品推荐

