【问题标题】:How to deserialize Json to Java Object with Enum?如何使用 Enum 将 Json 反序列化为 Java 对象?
【发布时间】:2018-06-07 16:22:05
【问题描述】:

我有以下 json 我想反序列化为 Java 对象:

{
"firstname": "John",
"lastname": "Do",
"sex": "",

}

在另一部分,我有一个 Java Rest Webservice:

@POST
@Consumes(APPLICATION_JSON)
@Produces(APPLICATION_JSON)
public Response findPerson(@Valid PersonneRequest personne) {

    if(personne!= null){
       Personne result = null;
      // do some stuff 

        return Response.ok(result).build();
    }

    // Bad request
    return Response.status(Response.Status.BAD_REQUEST).build();


}

这是 Personne 类:

公共类 PersonneRequest 实现 Serializable{

private String firstname;

private String lastname;

private Sex sex;

// getter 和 setter

}

这是我的 Sexe 课程:

public enum Sex{


    MAN("man"),
    WOMAN("woman");

    private String type;

    private Sex(String type){
        this.type = type;
    }

    public String getType(){
        if(type!=null && !StringUtils.isEmpty(type)){
            return type;
        }
        return MAN.getType();
    }
}

我的问题是当我在我的 webervice 上拨打电话时。当性别为空时,Json 数据不会反序列化。我收到以下异常。如何为 enum 的空值设置一个值? 这是我的 java 异常:

org.codehaus.jackson.map.JsonMappingException: Can not construct instance of Sex from String value '': value not one of declared Enum instance names
 at [Source: org.glassfish.jersey.message.internal.EntityInputStream@5ed82ec0; org.codehaus.jackson.map.JsonMappingException.from(JsonMappingException.java:163) ~[jackson-mapper-asl-1.9.2.jar:1.9.2]
    at org.codehaus.jackson.map.deser.StdDeserializationContext.weirdStringException(StdDeserializationContext.java:243) ~[jackson-mapper-asl-1.9.2.jar:1.9.2]
    at org.codehaus.jackson.map.deser.std.EnumDeserializer.deserialize(EnumDeserializer.java:74) ~[jackson-mapper-asl-1.9.2.jar:1.9.2]
    at org.codehaus.jackson.map.deser.std.EnumDeserializer.deserialize(EnumDeserializer.java:23) ~[jackson-mapper-asl-1.9.2.jar:1.9.2]
    at org.codehaus.jackson.map.deser.SettableBeanProperty.deserialize(SettableBeanProperty.java:299) ~[jackson-mapper-asl-1.9.2.jar:1.9.2]
    at org.codehaus.jackson.map.deser.SettableBeanProperty$MethodProperty.deserializeAndSet(SettableBeanProperty.java:414) ~[jackson-mapper-asl-1.9.2.jar:1.9.2]
    at org.codehaus.jackson.map.deser.BeanDeserializer.deserializeFromObject(BeanDeserializer.java:697) ~[jackson-mapper-asl-1.9.2.jar:1.9.2]
    at org.codehaus.jackson.map.deser.BeanDeserializer.deserialize(BeanDeserializer.java:580) ~[jackson-mapper-asl-1.9.2.jar:1.9.2]
    at org.codehaus.jackson.map.ObjectMapper._readValue(ObjectMapper.java:2695) ~[jackson-mapper-asl-1.9.2.jar:1.9.2]
    at org.codehaus.jackson.map.ObjectMapper.readValue(ObjectMapper.java:1308) ~[jackson-mapper-asl-1.9.2.jar:1.9.2]
    at org.codehaus.jackson.jaxrs.JacksonJsonProvider.readFrom(JacksonJsonProvider.java:419) ~[jackson-jaxrs-1.9.13.jar:1.9.13]

谢谢

【问题讨论】:

  • 确保您的客户端在不知道“sex”属性值时发送null而不是空字符串。

标签: java json serialization enums


【解决方案1】:

@JsonInclude(JsonInclude.Include.NON_EMPTY) 与属性 Sex 结合使用。它将处理空字符串值。

@JsonInclude(JsonInclude.Include.NON_EMPTY)
private Sex sex;

希望对你有帮助。

【讨论】:

    【解决方案2】:

    我认为您的代码存在两个问题: 首先,您在类枚举 Sex 中的 getType() 方法是错误的。返回 MAN.getType() 表示调用自身,从而导致不定式循环。可能是您想发现为枚举分配了 null 但方法不正确的情况。

    其次,与日志文件中的问题直接相关的原因是不能为枚举类型分配空值或空值。 我认为使用 @JsonIgnoreProperties 和 DeserializationFeature.READ_UNKNOWN_ENUM_VALUES_AS_NULL 是解决问题的最佳方法 参考这里的帖子:How to ignore enum fields in Jackson JSON-to-Object mapping?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-20
      • 1970-01-01
      相关资源
      最近更新 更多