jsonschema2pojo 生成没有任何键值对的枚举
Posted
技术标签:
【中文标题】jsonschema2pojo 生成没有任何键值对的枚举【英文标题】:jsonschema2pojo generating enum without any key value pairs 【发布时间】:2015-08-29 19:28:18 【问题描述】:我正在使用 jsonschema2pojo 从我的 JSON 模式生成 POJO。但是,当我使用命名枚举时,它似乎不起作用。而不是 POJO 中的键值对,它只是添加了__EMPTY__
。
我指定枚举的方式有问题还是 jsonschema2pojo 有问题?
JSON 架构:
"type": "object",
"$schema": "http://json-schema.org/draft-04/schema",
"description": "Status identifier",
"properties":
"status":
"type": "string",
"enum": [
"ACTIVE" : 0,
"INACTIVE" : 1
],
"description": "Defines whether schedule is active"
生成的 Java POJO
import java.util.HashMap;
import java.util.Map;
import javax.annotation.Generated;
import com.fasterxml.jackson.annotation.JsonAnyGetter;
import com.fasterxml.jackson.annotation.JsonAnySetter;
import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.annotation.JsonPropertyOrder;
import com.fasterxml.jackson.annotation.JsonValue;
import org.apache.commons.lang.builder.EqualsBuilder;
import org.apache.commons.lang.builder.HashCodeBuilder;
import org.apache.commons.lang.builder.ToStringBuilder;
/**
* Status identifier
*
*/
@JsonInclude(JsonInclude.Include.NON_NULL)
@Generated("org.jsonschema2pojo")
@JsonPropertyOrder(
"status"
) public class Testenum
/**
* Defines whether schedule is active
*
*/
@JsonProperty("status")
private Testenum.Status status;
@JsonIgnore
private Map<String, Object> additionalProperties=new HashMap<String, Object>();
/**
* Defines whether schedule is active
*
* @return
* The status
*/
@JsonProperty("status")
public Testenum.Status getStatus()
return status;
/**
* Defines whether schedule is active
*
* @param status
* The status
*/
@JsonProperty("status")
public void setStatus(Testenum.Status status)
this.status=status;
@Override
public String toString()
return ToStringBuilder.reflectionToString(this);
@JsonAnyGetter
public Map<String,
Object> getAdditionalProperties()
return this.additionalProperties;
@JsonAnySetter
public void setAdditionalProperty(String name,
Object value)
this.additionalProperties.put(name, value);
@Override
public int hashCode()
return new HashCodeBuilder().append(status).append(additionalProperties).toHashCode();
@Override
public boolean equals(Object other)
if (other==this)
return true;
if ((other instanceof Testenum)==false)
return false;
Testenum rhs=((Testenum) other);
return new EqualsBuilder().append(status,
rhs.status).append(additionalProperties,
rhs.additionalProperties).isEquals();
@Generated("org.jsonschema2pojo")
public static enum Status
__EMPTY__("", "");
private final String value;
private static Map<String, Testenum.Status> constants=new HashMap<String, Testenum.Status>();
static
for (Testenum.Status c: values())
constants.put(c.value, c);
private Status(String value)
this.value=value;
@JsonValue
@Override
public String toString()
return this.value;
@JsonCreator
public static Testenum.Status fromValue(String value)
Testenum.Status constant=constants.get(value);
if (constant==null)
throw new IllegalArgumentException(value);
else
return constant;
注意 - 如果我删除枚举名称并只指定如下值,它会非常好:
"type": "object",
"$schema": "http://json-schema.org/draft-04/schema",
"description": "Status identifier",
"properties":
"status":
"type": "string",
"enum": [
"ACTIVE" ,
"INACTIVE"
],
"description": "Defines whether schedule is active"
【问题讨论】:
您是否在同一个库中寻找JavaEnumNames? 【参考方案1】:[编辑]
TL;DR:通过定义键值对而不是 JSON 数组,您的架构不适合 json-schema.org's definition。
[/编辑]
在 Java 中,an Enum is best used 表示 creating a singleton 或 enforcing a value from fixed number of constants。这组固定的常量实际上只是一个值列表。
话虽如此,因为您的(第一个)JSON 模式对 status 属性的定义是它是一个字符串,并且可以是一组对象的值,而不是一组值的值。也就是说,根据documentation from jsonschema2pojo on defining with an enum,没有一组对象的例子,只有一组值。它需要一个值列表,仅此而已。
您在问题末尾的示例,“如果我删除枚举名称并仅指定如下值,它工作得非常好”,您的成功结果是因为您正在定义属性以根据什么来构建枚举jsonschema2pojo 正在等待。
我的建议:
使用您的最后一个示例,然后构建一个单独的 Mapprivate static int ACTIVE = 1;
)。
【讨论】:
有时为每个 ENUM 常量命名会有所帮助。如果我有像“S”代表活动的值和“D”代表不活动的等等......通过他们众所周知的名字来引用它们很有帮助......(活动,不活动)。我们可以在java中很好地做到这一点。问题是双重的——我们可以给 json 模式中的枚举命名吗? & 如果是这样,是否是正确的做法? 根据json-schema.org 和 jsonschema2pojo,看起来答案是否定的,你不能那样做。我明白你在尝试什么,这对我来说很有意义,但似乎你可能想要submit a feature request。 Jsonschema2pojo 看起来从 json-schema.org 获取他们的方案定义,所以他们是否会这样做可能会悬而未决。【参考方案2】:我为此目的使用预定义的枚举,其属性如下所示:
"organizationType" :
"javaType": "my.basepackage.api.enums.OrganizationType",
"enum": ["AUTHORITY", "COMPANY"]
然后我以任何我喜欢的方式手工制作我的枚举。您所要做的就是在您的 Java 枚举和 JSON 模式中具有匹配的枚举值 names。显然,这种方法的一个缺点是您不能在 JSON 中使用类似代码值之类的东西,例如 "A"
for AUTHORITY
on。您必须使用并公开这些枚举名称。但在我的特定用例中,您可以将这些枚举值转换为您喜欢的任何后端代码,例如数据库:
public enum OrganizationType
AUTHORITY ("A", "Authority"),
COMPANY ("C", "Company");
public final String code;
public final String label;
private OrganizationType(String code, String label)
this.code = code;
this.label = label;
最后,您始终可以使用自定义注释器来获取几乎所有可以从 JsonSchema2Pojo 编码的内容。因此,如果您可以定义您需要的内容(即使它与您不关心或想要满足您的需求的 JSON 模式规则相矛盾),您很可能可以在短时间内编写适合您的自定义。对我来说,这很容易,一旦你把脚弄湿,下次你需要的东西与开箱即用的工具有点不同时,你可能会更快地找到解决方案。例如,我为附加的 JSON-B 属性名称注释实现了一个注释器,让我可以灵活地选择解析器。由于我从早期的资料中了解了定制模式,因此很快就做出了使用定制的决定并更快地实施了。
【讨论】:
以上是关于jsonschema2pojo 生成没有任何键值对的枚举的主要内容,如果未能解决你的问题,请参考以下文章
JsonSchema2Pojo,出生日期使用类型编号生成,我正在尝试以整数形式传递值