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 时,它将其解释为 last
和 next
是不同的 类 而不是常见 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;
}
我正在尝试定义一个 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 时,它将其解释为 last
和 next
是不同的 类 而不是常见 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;
}