簡體   English   中英

如何使用Enum將Json反序列化為Java Object?

[英]How to deserialize Json to Java Object with Enum?

我想將以下json反序列化為Java對象:

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

}

在另一部分中,我有一個Java Rest Web服務:

@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;

//獲取器和設置器

}

這是我的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();
    }
}

我的問題是我在網絡服務台上發帖時。 當性別為空時,Json數據不會反序列化。 我收到以下異常。 如何為枚舉的空值設置值? 這是我的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]

謝謝

@JsonInclude(JsonInclude.Include.NON_EMPTY)與屬性Sex一起使用 它將處理空字符串值。

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

希望對您有所幫助。

我認為您的代碼中存在兩個問題:首先,類枚舉Sex中的getType()方法是錯誤的。 返回MAN.getType()意味着調用自身,從而導致無限循環。 可能是您想為枚舉分配null而不是正確的方法。

其次,與日志文件中的問題直接相關的原因是無法為枚舉類型分配null或空值。 我認為使用@JsonIgnoreProperties和DeserializationFeature.READ_UNKNOWN_ENUM_VALUES_AS_NULL是解決問題的最佳方法。請參閱此處的文章: 如何忽略Jackson JSON到對象映射中的枚舉字段?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM