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

时间:2015-06-14 04:19:08

标签: java json enums jsonschema jsonschema2pojo

我正在使用jsonschema2pojo从我的json架构生成POJO。但是,当我使用命名enums时,它似乎不起作用。而不是pojo中的键值对,它只是添加__EMPTY__。 我指定枚举的方式有问题,还是jsonschema2pojo的问题?

json Schema



{
	"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;
      }
    }
  }
}
&#13;
&#13;
&#13;

注意 - 如果我删除枚举名称并只指定下面的值

,它的工作正常

&#13;
&#13;
{
	"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"
		}
	}
}
&#13;
&#13;
&#13;

2 个答案:

答案 0 :(得分:0)

[编辑]

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

[/编辑]

在Java中,an Enum is best usedcreating a singleton enforcing a value from fixed number of constants。固定的常量集实际上只是一个值列表。

话虽如此,因为你的(第一个)JSON模式对status属性的定义是它是一个字符串,可以是一组对象的值,而不是一个集合的值。价值观换句话说,根据documentation from jsonschema2pojo on defining with an enum,没有一组对象的例子,只有一组值。它期待着一系列价值观,仅此而已。

你问题末尾的例子&#34;如果我删除枚举名称并且只是指定如下的值,那么它的效果非常好,&#34;您的成功结果是因为您正在根据 jsonschema2pojo 所期望的内容定义属性以构建枚举。

我的建议: 使用您的上一个示例,然后构建一个单独的 Map&lt; String,Integer&gt; 来配对&#34; Active&#34;和&#34;非活动&#34;数值表示的值(如果您希望有更大的列表),或者只是根据您的需要设置映射到数值的几个常量(例如 - private static int ACTIVE = 1;)。

答案 1 :(得分:0)

我为此使用预定义的枚举,其属性如下所示:

"organizationType" : {
    "javaType": "my.basepackage.api.enums.OrganizationType",
    "enum": ["AUTHORITY", "COMPANY"]
}

然后我以自己喜欢的方式手工制作枚举。您要做的只是在Java枚举和JSON模式中具有匹配的枚举值 names 。显然,这种方法的一个缺点是,您不能在JSON中使用类似代码值的内容,例如"A"AUTHORITY。您必须使用并因此公开那些枚举名称。但是在我的特殊用例中,您可以将这些枚举值转换为后端喜欢的任何代码,例如数据库:

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属性名称注释实现了注释器,例如,使我可以灵活选择解析器。由于我从较早的知识中就知道了定制模式,因此使用定制的决定很快做出,并且实施得更快。