3

可以验证 JSON,如果对象的值为 true,那么这个对象是有效的,如果 Obj2.included == true 是有效的,如果 Obj1.included == true ?

这是一小部分架构:

'attachments': {
                    'type': 'object',
                    'properties': {
                        'ZalA': {
                            'type': 'object',
                            'properties': {
                                'included': {
                                    'type': 'boolean'
                                },
                                'version': {
                                    'type': 'integer'
                                }
                            },
                            'required': [
                                'included',
                                'version'
                            ]
                        },
                        'ZalB': {
                            'type': 'object',
                            'properties': {
                                'version': {
                                    'type': 'integer'
                                },
                                'included': {
                                    'type': 'boolean'
                                },
                                'required': [
                                    'included',
                                    'version'
                                ]
                            }
                        }
                    }
                }

我想检查:

  • 如果 ZalA.included == true,则有效。
  • 如果 ZalA.included == true 并且 ZalB.included == true,则有效。
  • 如果 ZalA.included == false 和 ZalB.included == true,则无效。

是否可以使用 tv4 JSON 验证器检查这些约束?

4

1 回答 1

2

我有一个解决方案给你。但首先,您的架构中有一个小错误,因为required -property 在properties中:

'ZalB': {
            'type': 'object',
            'properties': {
                     'version': {
                         'type': 'integer'
                     },
                     'included': {
                         'type': 'boolean'
                     },
                     'required': [
                         'included',
                         'version'
                     ]
             }
 }

当你使用它时,你必须在properties之前或之后定义它。正如您使用ZalA 所做的:) 否则它不起作用。

现在回答你的问题,我用这个非常有趣的验证器做了一个小实验,并想出了这个:

// schema to be used for validating
var schema = {
  'type': 'object',
  'properties': {
    'ZalA': {
      'type': 'object',
      'properties': {
        'included': {
          'type': 'boolean',
          'enum': [
            true
          ]
        },
        'version': {
          'type': 'integer'
        }
      },
      'required': [
        'included',
        'version'
      ]
    },
    'ZalB': {
      'type': 'object',
      'properties': {
        'version': {
          'type': 'integer'
        },
        'included': {
          'type': 'boolean',
          'enum': [
            true
          ]
        }
      },
      'required': [
        'included',
        'version'
      ]
    },
    'required': [
      'ZalA'
    ],
  }
};

// data to be checked against
var data = {
  'ZalA': {
    'version': 1,
    'included': true
  },
  'ZalB': {
    'version': 2,
    'included': true
  }
}

tv4.validateResult(data, schema); // Object { missing=[0], valid=true, error=null}

必须配置架构以使其与您的清单匹配:

  • 如果 ZalA.included == true,则有效。

    'required': [
      'ZalA'
    ],
    

    在属性之后的架构末尾需要 ZalA,因此 ZalA 必须存在,因此您可以在每个级别中根据需要重复此选项。但这还不足以满足您的清单。接下来的配置是:

    'required': [
        'included',
        'version'
    ]
    

    'included': {
      'type': 'boolean',
      'enum': [true]
    },
    

    包含ZalA 的-property (实际上也是版本-property,它已经在您的问题中)必须存在且为,以便 ZalA 可以被视为有效。您可以定义一个不同类型的数组来检查属性是否具有特定值,或者您可以使用模式-option。

这些配置也适用于 ZalB,但有一个区别:

'required': [
   'ZalA'
],

只需要 ZalA,最后不需要 ZalB。

我们完成了!通过这些配置,您的所有下一个条件都得到满足:

  • 如果 ZalA.included == true 并且 ZalB.included == true,则有效。
  • 如果 ZalA.included == false 和 ZalB.included == true,则无效。

如果 ZalB.included 被授予 false 和 true ,那么只需执行以下操作:

 'enum': [
      true, false
 ]

或者完全省略enum -option 以便它首先必须是布尔值。

这确实是一个很好的验证器。感谢您的问题,我会将它用于未来的项目。

PS您可以节省自己为 ZalB 定义第二个架构,并仅引用(使用$ref)到 ZalA 的架构,但我没有对此进行测试。另一方面,您可以使用这个小模式:

var schema = {
  'type': 'object',
  'properties': {
    'included': {
      'type': 'boolean',
      'enum': [
        true
      ]
    },
    'version': {
      'type': 'integer'
    }
  },
  'required': [
    'included',
    'version'
  ]
};

并以这种方式使用它:

// a bundle of objects to be checked
var data = [{
    'version': 1,
    'included': true
},{
    'version': 2,
    'included': true
}];

// iterate through each object
for(var i=0; i < data.length;i++){

    var obj = data[i];

    // validate each object
    var result = tv4.validateResult(obj, schema);

    if(!result.valid){
      console.log("not valid: ",result.error);
    }

}

我只是为自己说话,但对我来说,这是验证器文档中最重要的一面。因为它包含您可以为要验证的某些属性定义的所有选项:

http://json-schema.org/latest/json-schema-validation.html

于 2015-02-02T16:11:58.567 回答