2017-02-03 3 views
1

부울 값 목록의 유효성을 검사하는 데 문제가 있습니다.부울 값 목록에 대한 JSON 스키마의 XOR 논리

[true,true,false]

만 오직 하나의 진정한 가치로 나열되어 있기 때문에 진실해야한다,이를 확인하지한다 : 내 입력입니다. 순간 내 스키마가 모든 포함 또는 하나 개 이상의 진정한 가치를 수용하여 정렬을 수행하지만 : 당신이 볼 수 있듯이

{ 
 
    "type": "array", 
 
    "items": { 
 
    "$ref": "#/definitions/_items" 
 
    }, 
 
    "$ref": "#/definitions/xor", 
 
    "definitions": { 
 
    "xor": { 
 
     "oneOf": [ 
 
     { 
 
      "$ref": "#/definitions/or" 
 
     }, 
 
     { 
 
      "$ref": "#/definitions/and" 
 
     } 
 
     ] 
 
    }, 
 
    "_items": { 
 
     "enum": [ 
 
     true, 
 
     1 
 
     ] 
 
    }, 
 
    "or": { 
 
     "not": { 
 
     "type": "array", 
 
     "items": { 
 
      "not": { 
 
      "$ref": "#/definitions/_items", 
 
      "maximum": 1, 
 
      "minimum": 1 
 
      } 
 
     } 
 
     } 
 
    }, 
 
    "and": { 
 
     "type": "array", 
 
     "items": { 
 
     "$ref": "#/definitions/_items" 
 
     } 
 
    } 
 
    } 
 
}

, 나는 최대를 해결하기 위해 노력하고 최소한의 속성이지만 결과에 영향을 미치지는 않습니다.

한 진실 테이블이 제대로 될 것이다 :

[true,true,false] => 거짓

[true,true,true] => 거짓

[true,false,false] => 진정한

[false,false,false] => 거짓

[false,true,false] => true

[false,false,true] => 진정한

[true,false,true] => 거짓

[false,true,true] => 거짓

답변

1

당신은 명시 적 진실 테이블을 사용할 수 있습니다

{ 
    "type": "array", 
    "minItems": 3, 
    "maxItems": 3, 
    "anyOf": [ 
    { 
     "items": [ 
     { "enum": [true] }, 
     { "enum": [false] }, 
     { "enum": [false] } 
     ] 
    }, 
    { 
     "items": [ 
     { "enum": [false] }, 
     { "enum": [true] }, 
     { "enum": [false] } 
     ] 
    }, 
    { 
     "items": [ 
     { "enum": [false] }, 
     { "enum": [false] }, 
     { "enum": [true] } 
     ] 
    } 
    ] 
} 

당신은 더 많은 것을 가진 일반적인 솔루션을 원하는 경우 3 개 항목보다 빨리 빠져 나간다.

draft-06은 최소한 하나의 항목이 일부 스키마 (정확히는 하나는 아님)와 일치하는지 확인할 수있는 "포함"키워드를 정의하지만, 표준 JSON 스키마 키워드는 원하는 것을 허용하지 않습니다. .

고정 된 수의 항목에 대해 프로그래밍 방식으로 스키마를 생성하거나 스키마없이 유효성을 검사 할 수 있습니다.

+0

실제로 프로그래밍 방식으로 스키마를 작성하기 때문에 어느 시점에서는 그렇게 생각하고있었습니다. 조언을 주셔서 감사합니다. – MarkokraM

+0

JSON Schema는이를 표현할 수 없다는 점에 동의하지만이 방법은 배열을 열거 형으로 사용하여 훨씬 간단하게 수행 할 수 있습니다. '{ "enum": [[true, false, false], [false, true, false], [false, false, true]]}'. 그러나 부울을 사용하기 때문에이 짧은 표기법으로 만 벗어날 수 있습니다. – Jason