2014-12-10 5 views
15

json 스키마에서 상속을 사용하여 Java 바인딩을 검색했으며 모든 검색에서 "allOf"사용법을 알게되었습니다.JSon 스키마 및 상속

allOf를 사용하면 잠재적으로 내 문제를 해결할 수 있지만 json 스키마에 실제 Java 상속 "B extends A"가있는 Java 코드를 생성 할 수있는 구조가 있는지 궁금합니다. 모든 속성을 인라인하지 않고 B 내부?

이것이 지원/실행 가능하거나 아니면 그냥 꿈꾸고 있는지 궁금합니다. 지원되지 않는다면 그 이유를 알고 싶을 것입니다.

+0

짧은에. 'allOf' 내부의 스키마 등은 서로를 알지 못하며 객체 지향적 인 의미에서 "확장"될 수 없습니다. https://spacetelescope.github.io/understanding-json-schema/reference/combining.html – chharvey

답변

21

OK, 음, 나는 모두의 저자 :

  • 현재 JSON 스키마 유효성 검사 사양;
  • 및 Java에서 JSON 스키마 유효성 검사에 가장 많이 사용되는 Java 라이브러리는 json-schema-validator입니다.

나는 귀하의 질문에 대답 할 수 있으며 기본 대답은 아니오입니다.

왜? 현재 정의 된 스키마 상속과 같은 것이 없기 때문입니다.

allOf을 사용하는 경우 allOf의 모든 스키마가 일치해야합니다. 이 JSON 또는 JSON에 무엇이 존재하는지 엄격하게 알고 있다면 additionalPropertiesfalse에 추가해야합니다. 따라서 상속받을 수 없습니다.

실제 솔루션은 초안 v5에서 제안한 메커니즘 인 $merge$patch 키워드입니다. 이것들은 RFC 7386 또는 RFC 6902 (자세한 내용은 here 참조) 중 하나를 사용하여 스키마를 패치 할 수있게하고 실제로 스키마 상속을 구현합니다. 한마디로

: 당신이 falseadditionalProperties을 설정하고 기본 JSON은 객체가 추가 객체 멤버를 정의 할 수 없습니다 경우

  • ;
  • 이 두 개의 새 키워드를 사용하면됩니다.
+0

빠른 답장을 보내 주셔서 감사합니다. 나는 그림을 얻는다. – user3748879

+0

그래, 나는 다음 단계로 JSON 스키마를 사용하는 데 필요한 노력을 기울이지 않았다는 것을 완전히 알고 있으며, 그것에 대해 나쁘다고 생각한다. 목록을 수정하라! – fge

+0

@fge -'$ merge' 또는'$ patch'는 실제로 상속을 깨뜨릴 것입니다. 그래서 나는 그걸 싸워 왔습니다. 이 시점에서 두 스키마 A와 B 사이에는 이론적 인 연결이 없습니다. 제약 조건을 확장하는 대신 제약 조건을 설명하는 문서를 패치했습니다. 예를 들어, OOP 상속에 직면 해있는 A에서 속성을 쉽게 쉽게 제거 할 수 있습니다. – cloudfeet

0

"jsonschema2pojo"프로젝트에는이 목적을위한 표기법이 포함되어 있습니다.

JSON 스키마에는 다음과 같은 내용이 포함됩니다.

"extendsJavaClass" : "com.somecompany.SomeBaseClass", 

{ 
    "title": "....", 
    "description": "....", 
    "type": "object", 
    "extendsJavaClass" : "com.somecompany.SomeBaseClass", 
    "properties": { 
    "...": { 
     "items": { 
     "$ref": "#/definitions/...." 
     }, 
     "type": "array" 
    } 
    ....... 
} 

다음 프로젝트에 의해 생성 된 클래스의 것 같은 절 " 연장";

/** 
* ... 
* <p> 
* ... 
* 
*/ 
@JsonInclude(JsonInclude.Include.NON_NULL) 
@JsonPropertyOrder({ 
    ... 
}) 
public class MyNewClass 
    extends SomeBaseClass 
{ 
... 
} 

here에서 유사한 표기법을 검색 할 수도 있습니다.

추신 : Theese 표기법은 "표준 JSON 스키마 구조"가 아닙니다. 그들은 표준 방법이 가능할 때까지 "just doing it"을 위해 추가됩니다.

희망 하시겠습니까?