2014-12-10 18 views
15

Przeszukałem schemat JSONA z powiązaniami java z dziedziczeniem, a wszystkie wyszukiwania doprowadziły mnie do użycia "allOf".Schemat JSona i dziedziczenie

Użycie allOf potencjalnie rozwiąże mój problem, ale zastanawiam się, czy istnieje konstrukcja w systemie json, którą mogę użyć, która wygeneruje mój kod Java z prawdziwym dziedzictwem java "B extends A" - zamiast wstawiania wszystkich właściwości z A wewnątrz B?

Zastanawiam się, czy jest to nawet obsługiwane/wykonalne lub po prostu śnię. Jeśli nie jest obsługiwane, chciałbym poznać powód.

+0

w skrócie, nie. schematy wewnątrz 'allOf' itd. nie znają się nawzajem i nie mogą być" rozszerzone "w sensie obiektowym. https://spacetelescope.github.io/understanding-json-schema/reference/combining.html – chharvey

Odpowiedz

21

OK, dobrze, ja jestem autorem zarówno:

  • obecny JSON Schemat walidacji specyfikacji;
  • i biblioteka Java, która jest obecnie najczęściej używana do sprawdzania poprawności schematu JSON w języku Java: json-schema-validator.

Więc mogę odpowiedzieć na twoje pytanie, a podstawową odpowiedzią jest nie.

Dlaczego? Ponieważ obecnie nie ma czegoś takiego jak dziedziczenie schematu.

Podczas korzystania z allOf wymagane jest, aby wszystkie schematy w allOf pasowały; a jeśli jesteś surowy o to, co może istnieć w tym lub innym JSON, dodałeś additionalProperties do false. W związku z tym nie możesz dziedziczyć.

Prawdziwym rozwiązaniem jest mechanizm, który zaproponowałem w wersji roboczej 5: słowa kluczowe $merge i $patch. Umożliwiłoby to łatanie schematów za pomocą RFC 7386 lub RFC 6902 (patrz: here, aby uzyskać więcej informacji) i rzeczywiście implementować dziedziczenie schematu.

W skrócie:

  • jeśli ustawisz additionalProperties do false, a Twój podstawowy JSON jest obiektem, nie będzie w stanie określić dodatkowych członków obiektu;
  • dzięki tym dwóm nowym słowom kluczowym możesz.
+0

Wielkie dzięki za szybką odpowiedź. Dostaję zdjęcie. – user3748879

+0

No cóż, jestem w pełni świadomy, że nie poświęciłem wysiłku, aby przystąpić do schematu JSON do następnego kroku, i źle się z tym czuję ... Napraw tę listę! – fge

+0

@fge - '$ merge' lub' $ patch' tak naprawdę * złamałoby * dziedziczenie, dlatego walczę z tym. W tym miejscu nie ma teoretycznego związku między dwoma schematami A i B - zamiast rozszerzania ograniczeń, załatałeś dokument opisujący ograniczenia. Jako przykład można równie łatwo * usunąć * właściwość z A, która leci w obliczu dziedziczenia OOP. – cloudfeet

0

"jsonschema2pojo" Projekt zawiera zapisy do tego celu.

W schemacie JSON wystarczy dołączyć coś takiego;

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

tj

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

następnie klasa generowane przez projekt, będzie mieć swoje "rozciąga" punkt a;

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

Możesz również wyszukać podobne oznaczenia w here.

PS: Notacje te nie są "standardowymi konstrukcjami schematów JSON". Są one dodawane ze względu na "just doing it", dopóki nie jest możliwe wykonanie standardowego sposobu.

Mam nadzieję, że pomoże ..