JSon 模式和继承

2022-09-01 23:11:49

我已经在json架构上搜索了带有java绑定的继承,所有搜索都使我使用了“allOf”。

使用allOf可能会解决我的问题,但我想知道json模式中是否有一个我可以使用的构造,它将使用真正的java继承“B扩展A”生成我的java代码 - 而不是从A内联到B中的所有属性?

我想知道这是否得到支持/可行,或者我只是在做梦。如果不支持,我会很好奇地想知道原因。


答案 1

好吧,好吧,我是两者的作者:

  • 当前的 JSON 架构验证规范;
  • 以及当今Java中用于JSON Schema验证的Java库:json-schema-validator

所以我可以回答你的问题,基本答案是否定的。

为什么?因为当前没有定义架构继承这样的东西。

使用 时,您需要所有架构都匹配;如果你对这个或那个JSON中可以存在的内容很严格,你将添加到 .因此,您不能继承。allOfallOfadditionalPropertiesfalse

真正的解决方案是我为v5草案提出的一个机制:和关键字。这些将允许使用RFC 7386或RFC 6902修补架构(有关详细信息,请参阅此处),并且确实实现了架构继承。$merge$patch

总之:

  • 如果设置为 ,并且您的基本 JSON 是一个对象,则无法定义其他对象成员;additionalPropertiesfalse
  • 有了这两个新关键字,你可以。

答案 2

"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
{
...
}

您也可以在此处搜索类似的符号。

PS:这些表示法不是“标准 JSON 架构构造”。添加它们是为了“只是这样做”,直到有可能采用标准的方式。

希望它有帮助..