Схема JSon и наследование
Я искал json-схему с привязками java с наследованием, и все поиски привели меня к использованию "allOf".
Использование allOf потенциально может решить мою проблему, но мне интересно, есть ли в json-схеме конструктор, который я могу использовать, который будет генерировать мой Java-код с реальным наследованием Java "B extends A", а не встраивать все свойства из A внутри B?
Мне интересно, если это даже поддерживается/выполнимо, или я просто мечтаю. Если не поддерживается, мне было бы интересно узнать причину.
Ответы
Ответ 1
ОК, ну, я автор обоих:
- текущая спецификация проверки JSON Schema;
- и библиотека Java, которая наиболее часто используется для проверки JSON Schema в Java сегодня: json-schema-validator.
Поэтому я могу ответить на ваш вопрос, а основной ответ - нет.
Почему? Потому что в настоящее время не существует такого понятия, как наследование схемы.
При использовании allOf
вам требуется, чтобы все схемы в allOf
соответствовали; и если вы строго придерживаетесь того, что может существовать в том или ином JSON, вы добавите additionalProperties
в false
. Таким образом, вы не можете наследовать.
Реальное решение - это механизм, который я предложил для проектов v5: ключевые слова $merge
и $patch
. Это позволит исправить схемы с помощью RFC 7386 или RFC 6902 (см. здесь для получения дополнительной информации) и действительно реализовать наследование схемы.
Короче:
- если вы установите
additionalProperties
в false
, а ваш основной JSON - это объект, вы не сможете определить дополнительные члены объекта;
- с этими двумя новыми ключевыми словами, вы можете.
Ответ 2
" jsonschema2pojo" проект содержит обозначения для этой цели.
В схеме JSON просто включите что-то вроде этого:
"extendsJavaClass" : "com.somecompany.SomeBaseClass",
то есть.
{
"title": "....",
"description": "....",
"type": "object",
"extendsJavaClass" : "com.somecompany.SomeBaseClass",
"properties": {
"...": {
"items": {
"$ref": "#/definitions/...."
},
"type": "array"
}
.......
}
тогда класс, сгенерированный проектом, будет иметь предложение extends ":
/**
* ...
* <p>
* ...
*
*/
@JsonInclude(JsonInclude.Include.NON_NULL)
@JsonPropertyOrder({
...
})
public class MyNewClass
extends SomeBaseClass
{
...
}
Также вы можете искать похожие обозначения в здесь.
PS: Эти обозначения не являются "стандартными конструкциями схемы JSON". Они добавляются ради " просто делать это "до тех пор, пока не будет стандартный способ сделать это.
Надеюсь, что это поможет.