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 正在等待。

我的建议: 使用您的最后一个示例,然后构建一个单独的 Map 以将“活动”和“非活动”值与其数字表示配对(如果您希望有一个更大的列表),或者只需根据您的需要设置几个映射到数值的常量(例如-private 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 生成没有任何键值对的枚举的主要内容,如果未能解决你的问题,请参考以下文章

如何解析没有分隔符的键值对的字符串?

获取 RocksDB 中键值对的总数

JsonSchema2Pojo,出生日期使用类型编号生成,我正在尝试以整数形式传递值

传递键值对是不是也可以防止 SQL 注入攻击?

jsonschema2pojo 生成的 POJO 有 Android Studio 无法理解的注解

如果它们共享任何键值对,如何合并来自不同列表的多个字典?