2016-08-05 48 views
2

Mein JSON-Datenmodell verfügt über ein Objekt mit einer Reihe von Eigenschaften, von denen nur eine oder keine vorhanden sein kann, sowie andere Eigenschaften mit eigenen Einschränkungen. Gibt es eine Möglichkeit, dies ohne Wiederholung wie in this example zu tun?1 oder kein Satz von Eigenschaften im JSON-Schema

Unten ist ein einfaches Beispiel von so nah wie ich dies mit Node.js + ajv erreicht haben.

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 

Antwort

1

Sie müssen auf andere Weise über das Problem nachdenken. Anstatt auszudrücken, was das Schema sein kann, versuche auszudrücken, was das Schema nicht sein kann. Hier sind zwei Optionen.

Ein Weg ist zu sagen, "a" und "b" können nicht beide vorhanden sein.

Eine andere Möglichkeit, die Frage einzukreisen, ist, dass, wenn "a" vorhanden ist, dann "b" nicht vorhanden sein kann. Und wenn "b" vorhanden ist, kann "a" nicht vorhanden sein.

{ 
    "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

Danke Jason. Das Verwenden von Abhängigkeiten ist das, was ich benötigt habe, wie in Ihrem zweiten Beispiel, aber ohne die Verwendung von erforderlich. z.B. "a": {"nicht": ["b"]}, "b": {"not": ["a"]} – Severin

+0

Tatsächlich funktionierte das nicht, da der Wert eines Schlüsselwortes kein Objekt sein muss. Wie kann ich sagen, mit Abhängigkeiten, "wenn 'a' vorhanden ist, kann 'b' nicht vorhanden sein und umgekehrt" – Severin

+0

Ich bin mir nicht sicher, was Sie versuchen zu lösen. Beide Schemata, die ich gegeben habe, funktionieren korrekt wie angegeben. Ich brauche mehr Informationen darüber, was genau für dich nicht funktioniert. – Jason