2017-10-12 5 views
0

노드의 AJV (JSON 스키마 적용)를 사용하고 있습니다.JSON 스키마/AJV 배열 항목이 다른 배열에 있어야합니다.

array1 properties.bars의 유효성을 검사하고 싶습니다. 충분히 쉬워.

그럼 array2에있는 항목 properties.barsproperties.keep이 있는지 확인하고 싶습니다.

어떻게해야합니까?

는 내가 가지고 :

const config = require('../../../config') 
const VALID_BARS = Object.keys(config.LHS_RHS_LOOKUP) 

const schemaItems = { 
    id: 'schemaItems', 
    type: 'string', 
    anyOf: [ 
    { enum: VALID_BARS }, 
    { pattern: '^[^\\s]+ [^\\s]+$' } 
    ] 
} 

const schemaOptions = { 
    type: 'object', 
    properties: { 
    bars: { 
     type: 'array', 
     default: [VALID_BARS[0]], 
     items: schemaItems, 
     minItems: 1, 
     uniqueItems: true 
    }, 
    keep: { 
     type: 'array', 
     default: [], 
     items: schemaItems, // << THIS NEEDS TO CHANGE 
     minItems: 0, 
     uniqueItems: true 
    }, 
    protect: { 
     default: true, 
     type: 'boolean' 
    } 
    } 
} 

module.exports = schemaOptions 

답변

1

당신은 첫 번째 배열에 $data pointer을 사용할 것입니다. 지금은 단지 proposal입니다. 그것은 데이터 다른 값의 값을 사용하여 키워드에 값을 할당 할 수있게합니다.

이 경우 두 번째 배열의 items 속성에는 첫 번째 배열의 $ data 값을 사용할 enum 속성이 있습니다.

이렇게하려면 첫 번째 배열 자체를 참조하지 않도록 원래 스키마에서 'anyOf'를 제거해야했습니다. 또한 $ ref와 정의를 통해 스키마 항목을 기본 스키마에 결합했습니다.

여기에 a PLNKR이 사용 중입니다. 유효한 데이터 샘플이 될 것

let schema = { 
    definitions: { 
    schemaItems: { 
     id: 'schemaItems', 
     type: 'string', 
     pattern: '^[^\\s]+ [^\\s]+$' 
    } 
    }, 
    type: 'object', 
    properties: { 
    bars: { 
     type: 'array', 
     items: { 
     $ref: "#/definitions/schemaItems" 
     }, 
     minItems: 1, 
     uniqueItems: true 
    }, 
    keep: { 
     type: 'array', 
     items: { 
     type: 'string', 
     enum: { 
      "$data": "/bars" 
     } 
     }, 
     minItems: 0, 
     uniqueItems: true 
    }, 
    protect: { 
     default: true, 
     type: 'boolean' 
    } 
    } 
}; 

그리고 :

테스트 코드는 같은 보일 것이다 노력과 명확한 설명을위한

let data = { 
    bars: [ 
    "d d", 
    "b b" 
    ], 
    keep: [ 
    "d d" 
    ], 
    protect: true 
}; 
+0

감사 로이을 :) – danday74