2016-08-05 6 views
2

My JSONデータモデルには、1つまたはnoneのみが存在する可能性のあるプロパティセットと、独自の制約を持つ他のプロパティが存在するオブジェクトがあります。 this exampleのように繰り返しなくてもこれを行う方法はありますか?JSONスキーマのプロパティセットの1つまたは全くなし

以下は、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 

答えて

1

あなたは別の方法で問題について考える必要があります。スキーマができるものを表現しようとするのではなく、スキーマができないものを表現してみてください。ここには2つのオプションがあります。

「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 
} 
+0

ありがとうございました。依存関係を使用するのは、2番目の例のように、必要なものを使用せずに必要なものです。例えば "a":{"not":["b"]} "b":{"not":["a}]} – Severin

+0

実際には、キーワードの値はオブジェクトでなければならないため、実際には機能しませんでした。どのように私は、依存関係を使用して "a 'が存在する場合、' b 'は存在することはできません。逆の場合も同様です。 – Severin

+0

解決しようとしていることがわかりません。私が与えた両方のスキーマは、与えられた通り正しく動作します。私は正確にあなたのために働いていないものについて、より多くの情報が必要です。 – Jason

関連する問題