2015-01-08 4 views
0

사양 (http://json-schema.org/schema)에 따르면 스키마 키워드에는 상호 제외가 없습니다.json 스키마에서 키워드 사이의 논리적 관계는 무엇입니까?

{ 
    "properties" : { 
     "foo" : {"type" : "string"} 
    } 
    "items" : [ 
     {"type" : "integer" }, 
     {"type" : "number" } 
    ] 
} 

겠습니까 객체와 배열 모두에 대해이 스키마 유효성 검사 : 예를 들어 나는 다음과 같은 스키마를 만들 수 있을까? 그렇다면 키워드 사이에 "OR"관계가 있음을 의미합니다.

그러나 우리는 다음과 같은 스키마를 고려하는 경우 :

{ 
    "anyOf" : [ 
     { "type" : "string",}, 
     { "type" : "integer"} 
    ] 
    "not" : { 
     { "type" : "string", 
     "maxLength" : 5 
     } 
    } 
} 

이 실행 하는가가 아니라 키워드 사이에 "AND"관계가 될 것이다 해석하는 가장 실용적인 방법을.

초안 v4에서 키워드가 논리적으로 상호 작용하는 방법을 알 수 없습니다. 누구든지이 질문에 대답 할 수있는 문서/표준을 가르쳐 줄 수 있습니까?

답변

0

키워드는 항상 "AND"관계입니다. 데이터는 스키마의 모두 키워드를 만족해야합니다.

propertiesitems 키워드는 개체의 유형을 지정하지 않습니다 (이 경우 type을 사용해야합니다). 대신 특정 유형에 대해서만 의미를 가지며 그렇지 않으면 무시됩니다. 그래서 properties 실제로 의미 : 데이터를 다음 속성 정의를 적용, 객체입니다

경우 ...이 properties은 때로 믿을 값을 무시하기 때문에 {"properties":{...}}는 어떤 문자열과 일치하는 것을 의미합니다

개체. 그리고 items 실제로 의미 : 데이터가 배열

경우 다음 항목의 정의가 적용 ...

그래서 AND 조합은 다음과 같습니다 데이터 경우 (

객체이면 properties이 적용됩니다. AND (데이터가 배열 인 경우 items이 적용됩니다)

+0

"객체가 아닌 객체에 대해서는"속성이 무시됩니다 "라는 말 대신"객체가 아닌 JSON 값에 대해서는 "속성이 무시됩니다" – fge

0

사양에 분명히 명시된 바와 같이 일부 키워드는 특정 유형의 JSON 값 또는 모든 키워드와 관련이 있습니다.

따라서 properties은 유효성을 검사하는 JSON 값이 JSON 객체 인 경우에만 적용됩니다. 객체가 아닌 모든 JSON 값에는 적용되지 않습니다. 유효성을 검사 할 JSON 값이 JSON 객체가 아닌 경우이 키워드에 대한 유효성 검사가 항상 성공한다는 사실을 이해하는 또 다른 방법입니다.

마찬가지로 items은 JSON 값이 JSON 배열 인 경우에만 적용됩니다.

이제는 일부 키워드가 모든 유형에 적용됩니다. 그 중에서도 enum, allOf, anyOf, oneOf, type이 있습니다. 각각의 경우에 유효성 검사 규칙이 사양에 명확하게 정의되어 있습니다.

요약하면 어떤 값 유형이 필요한지 고려해야합니다. 스키마에 지정된 유형의 수의 값을 강제하는 가장 쉬운 방법은 같이 type을 사용하는 것입니다

"type": "integer" 

하지만이 키워드는 그럼에도 불구하고 검증 과정에서 다른 모든 독립적으로 적용됩니다. 빈 JSON 배열이 확인을 위해 전달되면

{ 
    "type": "integer", 
    "minItems": 1 
} 

이 두 키워드를 실패합니다 : 그래서,이 법적 스키마는

  • type 값이 배열하지 않기 때문에,
  • minItems 값이 배열이기 때문에 0 요소를 가지므로 배열의 요소 하나 이상을 예상하므로 특정 키워드에 대해서는 유효하지 않습니다.

유효성 검사 결과는 키워드을 평가하는 순서와 완전히 독립적 인 입니다. 이것이 JSON Schema의 기본 속성입니다. JSON 객체의 멤버 순서가 무의미하기 때문에 (JSON 객체와 동일한 JSON 객체 인 { "a": 1, "b": 2 }) 요구 사항입니다. { "b": 2, "a": 1 }과 같습니다.

물론 하나의 키워드 만 유효성 검사에 실패하면 전체 JSON 값이 스키마에 대해 유효하지 않습니다.

관련 문제