2017-12-16 15 views
2

Ist es möglich, das Schema eines Feldes zu ändern - entsprechend dem Wert eines anderen?JSON-Schematyp und Wertabhängigkeiten

Hinweis: Ich verwende Ajv

Beispiel mit Joi (A nicht JSON-Schema-Validator):

const schema = { 
    a: Joi.valid('x', 'y', 'z'), 
    b: Joi.string() 
     .when('a', { is: 'z', then: Joi.string(), otherwise: Joi.number() }), 
}; 

Antwort

0

Der direkteste Weg, ein $ ref Link auf einer $data pointer abhängig zu haben wäre . Leider wird das im Moment nicht unterstützt.

Es ist wahrscheinlich sauberer, es mit Anwendungslogik zu tun, aber wenn Sie in einer Situation sind, in der Sie ein Schema verwenden müssen, wäre eine ausführlichere Methode oneOf. In diesem Szenario würde das Schema so etwas wie:

var ajv = new Ajv({ 
 
    $data: true 
 
}); 
 
let schema = { 
 
    oneOf: [ 
 
    { 
 
     title: 'A is Z', 
 
     type: 'object', 
 
     properties: { 
 
     a: { 
 
      type: 'string', 
 
      enum: ['z'] 
 
     }, 
 
     b: { 
 
      type: 'string' 
 
     } 
 
     } 
 
    }, 
 
    { 
 
     title: 'A is not Z', 
 
     type: 'object', 
 
     properties: { 
 
     a: { 
 
      type: 'string', 
 
      not: { 
 
      enum: ['z'] 
 
      } 
 
     }, 
 
     b: { 
 
      type: 'number' 
 
     } 
 
     } 
 
    } 
 
    ] 
 
}; 
 

 
let data = { 
 
    a: 'z', 
 
    b: '5' 
 
}; 
 

 
ajv.validate(schema, data) 
 

 
console.log('ERRORS: ', this.ajv.errors)
<script data-require="[email protected]*" src="https://cdnjs.cloudflare.com/ajax/libs/ajv/5.3.0/ajv.bundle.js"></script>

EDIT: Da Sie AJV verwenden Sie auch die Vorteile der AJV-Keywords module nehmen. Es hat einen if/then/else Operator, der derzeit a proposal für das Hinzufügen zu der Spezifikation ist.