Схема 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". Они добавляются ради " просто делать это "до тех пор, пока не будет стандартный способ сделать это.

Надеюсь, что это поможет.