2017-02-27 2 views
1

정책 언어의 유효성을 검사하기위한 스키마를 만들려고합니다. 짧은 :Json 스키마 oneOf with additionalProperties draft-04

정책이 어설 션과 연결되어 있습니다. 이 어설 션은 연산자 (및 또는 아님) 일 수 있으며 다른 어설 션 목록을 포함 할 수 있습니다. 어서션은 프리미티브 (리프 노드) 일 수도 있습니다.

UML diagram

{ 
    "policy": { 
    "name": "test", 
    "expression": { 
     "operator": "all", 
     "value": [ 
     { 
      "primitive": "encrypt", 
      "preference": 12345, 
      "usage": "required" 
     }, 
     { 
      "primitive": "sign", 
      "preference": 12345, 
      "usage": "required" 
     } 
     ], 
     "preference": 12345, 
     "usage": "required" 
    } 
    } 
} 

을 그리고 여기에 내가 만든 currenty 계획입니다 : :

{ 
    "$schema": "http://json-schema.org/draft-04/schema#", 
    "type": "object", 
    "minProperties": 1, 
    "additionalProperties": { 
    "$ref": "#/definitions/policy" 
    }, 
    "definitions": { 
    "policy": { 
     "title": "Policy", 
     "type": "object", 
     "required": [ 
     "name", 
     "expression" 
     ], 
     "additionalProperties": false, 
     "properties": { 
     "name": { 
      "type": "string" 
     }, 
     "expression": { 
      "$ref": "#/definitions/assertion" 
     } 
     } 
    }, 
    "operator": { 
     "properties": { 
     "value": { 
      "type": "array", 
      "items": { 
      "$ref": "#/definitions/assertion" 
      } 
     }, 
     "operator": { 
      "enum": [ 
      "allOne", 
      "all" 
      ] 
     } 
     } 
    }, 
    "primitive": { 
     "properties": { 
     "primitive": { 
      "enum": [ 
      "encrypt", 
      "sign" 
      ] 
     } 
     } 
    }, 
    "assertion": { 
     "type": "object", 
     "additionalProperties": false, 
     "oneOf": [ 
     { 
      "$ref": "#/definitions/operator" 
     }, 
     { 
      "$ref": "#/definitions/primitive" 
     } 
     ], 
     "properties": { 
     "preference": { 
      "type": "integer", 
      "minimum": 0, 
      "exclusiveMinimum": true 
     }, 
     "usage": { 
      "enum": [ 
      "required", 
      "rejected", 
      "optional", 
      "observed", 
      "ignored" 
      ] 
     } 
     } 
    } 
    } 
} 

"oneOf" I의 사용으로

나는 쉽게 일을 이해할 수 있도록하는 UML 디자인했다 연산자 나 프리미티브의 명세를 사용하려한다. 그러나 나는 이것이 내가 다음과 같은 오류가 발생하기 때문에 길을 가야하는 것입니다 확실하지 않다 :

"message" : "object instance has properties which are not allowed by the schema: [\"operator\",\"value\"]"

오류 메시지 (때문에 "additionalProperties": false의) 정의되지 않은 추가 속성에 대해 불평. 그러나 이것들은 정의에 정의되어 있습니다 ...

+0

이를 참조하십시오 : 내 예는 다음이 될 것 https://github.com/epoberezkin/ajv/blob/master/FAQ.md#additional-properties-inside-compound-keywords-anyof-oneof- 등 및이 : https://github.com/epoberezkin/ajv/issues/134#issuecomment-242989744 – esp

+0

알았어요! 정보 주셔서 감사합니다. – freskimo

답변

0

oneOf, anyOf ... 키워드는 다른 정의를 참조하는 데 사용할 수 없습니다. 그들은 required에서 일합니다. 해결책은 모든 속성을 선언하고 컨텍스트에서 필요한 속성 만 필요로하는 것입니다.

"assertion": { 
    "type": "object", 
    "additionalProperties": false, 
    "oneOf": [ 
    { 
     "required": [ 
     "operator" 
     ] 
    }, 
    { 
     "required": [ 
     "primitive" 
     ] 
    } 
    ], 
    "properties": { 
    "operator": { 
     "$ref": "#/definitions/operator" 
    }, 
    "primitive": { 
     "$ref": "#/definitions/primitive" 
    }, 
    "preference": { 
     "type": "integer", 
     "minimum": 0, 
     "exclusiveMinimum": true 
    }, 
    "usage": { 
     "enum": [ 
     "required", 
     "rejected", 
     "optional", 
     "observed", 
     "ignored" 
     ] 
    } 
    } 
}