JSON 架构 属性 的多个实例

JSON Schema multiple instances of a property

我正在尝试定义一个 json 模式,其中有多个属性是 Java 应用程序端点的同一对象的实例。

我正在尝试做的一个简单示例是这个

{
"$schema": "http://json-schema.org/draft-07/schema",
"type": "object",

"properties": {
    "last": {
        "$ref": "#/$def/node"
    },
    "next": {
        "$ref": "#/$def/node"
    }
},
"$def": {
    "node": {
        "type": "object",
        "properties": {
            "item": "object"
        }
    }
}}

问题是,当我将其传递给 jsonschema2pojo 时,它将其解释为 lastnext 是不同的 类 而不是常见 node对象。

------------------------------------com.example.Last.java----- ------------------------------

package com.example;

import com.google.gson.annotations.Expose;
import com.google.gson.annotations.SerializedName;

public class Last {

@SerializedName("item")
@Expose
public Object item;

}

------------------------------------com.example.Next.java----- ------------------------------

package com.example;

import com.google.gson.annotations.Expose;
import com.google.gson.annotations.SerializedName;

public class Next {

@SerializedName("item")
@Expose
public Object item;

}

---------------------------------com.example.Node.java----- ------------------------------

package com.example;

import com.google.gson.annotations.Expose;
import com.google.gson.annotations.SerializedName;

public class Node {

@SerializedName("last")
@Expose
public Last last;
@SerializedName("next")
@Expose
public Next next;

}

是否可以在 json-schema 中有多个 属性 的实例,我会表达这个吗?或者这是 jsonschema2pojo tool/plugin 的限制?或者 json-schema 是否需要将多个实例放入数组中?

看来您必须通过在您的定义中声明特定的 "javaType" 来强制使用相同的类型,不幸的是,这是特定于工具的(根据您的评论,这是您想避免的事情)。

以下在 jsonschema2pojo.org 上工作:

输入:JSON 架构

{
  "type": "object",
  "properties": {
      "last": {
        "$ref": "#/definitions/node"
      },
      "next": {
        "$ref": "#/definitions/node"
      }
  },
  "definitions": {
      "node": {
          "javaType" : "com.example.Node",
          "type": "object",
          "properties": {
            "item": {}
          }
      }
  }
}

输出:com.example.Example.java

package com.example;

import com.google.gson.annotations.Expose;
import com.google.gson.annotations.SerializedName;

public class Example {

    @SerializedName("last")
    @Expose
    public Node last;
    @SerializedName("next")
    @Expose
    public Node next;

}

输出:com.example.Node.java

package com.example;

import com.google.gson.annotations.Expose;
import com.google.gson.annotations.SerializedName;

public class Node {

    @SerializedName("item")
    @Expose
    public Object item;

}