【问题标题】:JSon schema and InheritanceJSON模式和继承
【发布时间】:2015-02-09 04:35:09
【问题描述】:

我搜索了带有继承的 java 绑定的 json 模式,所有搜索都导致我使用“allOf”。

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

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

【问题讨论】:

标签: java json inheritance binding jsonschema


【解决方案1】:

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

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

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

为什么?因为目前没有定义模式继承之类的东西。

使用allOf 时,您要求allOf 中的所有模式都匹配;如果您对这个或那个 JSON 中可能存在的内容很严格,您将添加 additionalPropertiesfalse。因此,您不能继承。

真正的解决方案是我为草案 v5 提出的一种机制:$merge$patch 关键字。这些将允许使用 RFC 7386 或 RFC 6902 修补模式(有关更多信息,请参阅here)并确实实现模式继承。

简而言之:

  • 如果您将additionalProperties 设置为false,并且您的基本JSON 是一个对象,您将无法定义其他对象成员;
  • 使用这两个新关键字,您可以。

【讨论】:

  • 非常感谢您的快速回复。我明白了。
  • 是的,我完全清楚我没有花费所需的精力将 JSON Schema 带到下一步,我为此感到难过...错误列表!
  • @fge - $merge$patch 实际上会 break 继承,这就是我一直在与之抗争的原因。那时,两个模式 A 和 B 之间没有理论上的联系 - 您没有扩展约束,而是修补了描述约束的文档。例如,您可以轻松地从 A 中删除一个属性,这与 OOP 继承相悖。
  • @cloudfeet 当然,除了继承之外,您还可以做更多的事情;尽管如此,它允许它并且仍然是迄今为止提出的所有解决方案中最干净的解决方案。此外,许多人似乎很方便地忘记了 JSON Schema 验证所有值,而不仅仅是 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
{
...
}

您也可以在here 中搜索类似的符号。

PS:这些符号不是“标准 JSON 模式结构”。它们是为了“just doing it”而添加的,直到可以使用标准方法。

希望对你有帮助..

【讨论】:

    【解决方案3】:

    你有 3 个选项,我使用的是 jsonschema2pojo : 1.0.0-alpha2

    "extends": {
        "$ref": "MyObject.json"
    }
    

    "extends": {
        "type": "object",
        "javaType": "com.mycompany.model.MyObject"
    }
    

     "extendsJavaClass" : "com.mycompany.model.MyObject"
    

    【讨论】:

    • 所以你的意思是:即使五年后,myuce 的答案仍然有效,并且根据 2019-09 草案没有标准方法。有点可悲,但也有道理,因为多态性在不同的编程语言中的工作方式不同。
    猜你喜欢
    • 2023-03-21
    • 1970-01-01
    • 2019-07-20
    • 2014-01-31
    • 2015-08-03
    • 1970-01-01
    • 2013-12-24
    • 2016-05-23
    • 1970-01-01
    相关资源
    最近更新 更多