[英]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.