2017-12-16 23 views
2

フィールドのスキーマを別の値に変更することはできますか?JSONスキーマ型と値の依存性

注:私が使用しているAjv

例(非JSON-スキーマバリ)Joiを使用して:$ refのリンクは$data pointerに応じて、持っているだろう

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

答えて

0

最も直接的な方法を。残念ながら、現時点ではサポートされていません。

アプリケーションロジックを使用するのはおそらくより洗練されていますが、スキーマを使用する必要がある場合は、oneOfを使用する方がより冗長な方法になります。あなたがAJVを使用しているので、あなたもAJV-Keywords moduleを活用することができ:

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:そのシナリオでは、あなたのスキーマは次のようなものになるだろう。これには、if/then/else演算子があり、現在は仕様に追加するためにa proposalです。