2017-12-16 3 views
2

필드의 스키마를 다른 값으로 변경할 수 있습니까?JSON 스키마 유형 및 값 종속성

참고 : 내가 사용 Ajv

예 (비 JSON-스키마 유효성 검사기) Joi를 사용 : A $ 심판의 링크가 $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-Keywords module을 활용할 수 당신이 AJV를 사용하고 있기 때문에 :

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>

편집 :이 시나리오에서는 스키마 뭔가처럼 될 것입니다. 여기에는 if/then/else 연산자가 있으며이 연산자는 사양에 추가하기 위해 현재 a proposal입니다.