java - jsonschema2pojo 生成没有任何键值对的枚举

标签 java json enums jsonschema jsonschema2pojo

我正在使用 jsonschema2pojo 从 JSON 模式生成 POJO。但是,当我使用命名枚举时,它似乎不起作用。它只是添加了 __EMPTY__,而不是 POJO 中的键值对。

我指定枚举的方式有问题还是 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"
        }
    }
}

最佳答案

[编辑]

TL;DR:通过定义键值对而不是 JSON 数组,您的架构不符合 json-schema.org's definition .

[/编辑]

在 Java 中,an Enum is best used对于 creating a singletonenforcing a value from fixed number of constants 。该固定常量集实际上只是一个值列表。

话虽这么说,因为您的(第一个)JSON 模式对状态属性的定义是它是一个字符串,并且可以是一组对象的值,而不是一组值的值。换句话说,根据documentation from jsonschema2pojo on defining with an enum ,没有一组对象的示例,只有一组值。它需要一个值列表,仅此而已。

您的问题末尾的示例是“如果我删除枚举名称并仅指定如下值,则效果非常好”,您成功的结果是因为您正在定义属性以根据 jsonschema2pojo 的预期构建枚举。

我的建议: 使用您的最后一个示例,然后构建一个单独的 Map 将“Active”和“Inactive”值与其数字表示形式配对(如果您希望拥有更大的列表),或者仅根据您的需要设置几个映射到数字值的常量(例如 - private static int ACTIVE = 1;)。

关于java - jsonschema2pojo 生成没有任何键值对的枚举,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30825900/

相关文章:

java - JClouds 和 OpenStack : IllegalStateException: Expected BEGIN_ARRAY but was STRING

python - python 从json数组中删除多余的键值

java - Android GSON - 使用 JSON 结构化对象的模板

enums - 为什么在 Enum.each 中设置的变量没有保存?

c# - 如何比较枚举值和整数值?

java - 按 yyyymmdd 整数计算日差时结果不一致

java - 调试 Java 程序 - 字节转换器

java - Netbeans 8.2 Designer 无法加载类

javascript - 使用 Node.js 解析 SDK JavaScript ENOTFOUND

c++ - 信号中的 Qt 枚举需要 qRegisterMetaType