1或JSON模式中的一组属性

我的JSON数据模型有一个对象,其中只有一个或一个属性,以及其他属性都有自己的约束。 有没有办法做到这一点,而不是在这个例子中重复?

下面是一个简单的例子,就像我已经用Node.js + ajv实现这个一样。

var Ajv = require('ajv'), ajv = new Ajv(); var schema = { type: 'object', properties: { id: {type: 'string'}, a: {type: 'integer'}, b: {type: 'integer'} }, required: ['id'], oneOf: [ {required: ['a']}, {required: ['b']} ], additionalProperties: false }; // invalid var json1 = { id: 'someID', a: 1, b: 3 }; // valid var json2 = { id: 'someID', b: 3 }; // valid var json3 = { id: 'someID', a: 1 }; // valid var json4 = { id: 'someID' }; var validate = ajv.compile(schema); console.log(validate(json1)); // false console.log(validate(json2)); // true console.log(validate(json3)); // true console.log(validate(json4)); // false 

你必须以不同的方式思考问题。 不要试图expression模式可能是什么,而是尝试expression模式不可能的东西。 这里有两个选项。

一种方法是说“a”和“b”不能同时存在。

 { "type": "object", "properties": { "id": { "type": "string" }, "a": { "type": "integer" }, "b": { "type": "integer" } }, "required": ["id"], "not": { "required": ["a", "b"] }, "additionalProperties": false } 

另一种解决问题的方法是,如果“a”存在,则“b”不能存在。 而且,如果“b”存在,则“a”不能出现。

 { "type": "object", "properties": { "id": { "type": "string" }, "a": { "type": "integer" }, "b": { "type": "integer" } }, "required": ["id"], "dependencies": { "a": { "not": { "required": ["b"] } }, "b": { "not": { "required": ["a"] } } }, "additionalProperties": false }