2017-12-27 32 views
0

Ich habe folgendes json i auf ein Java-Objekt deserialisieren möchten:Wie JSON zu Java-Objekt mit Enum deserialisieren?

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

} 

Im anderen Teil ich eine Java Ruhe Webservice haben:

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


} 

Hier ist die Personne Klasse:

öffentliche Klasse PersonneRequest implementiert Serializable {

private String firstname; 

private String lastname; 

private Sex sex; 

// Getter und Setter

}

Hier ist meine Sexe Klasse:

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(); 
    } 
} 

Mein Problem ist, wenn ich einen Post Anruf auf meinem webervice machen. JSON-Daten werden nicht deserialisiert, wenn der Sex leer ist. Ich bekomme die folgende Ausnahme. Wie setze ich einen Wert für den leeren Wert von enum? Hier ist meine Java-Ausnahme:

org.codehaus.jackson.map.JsonMappingException: Can not construct instance of Sex from String value '': value not one of declared Enum instance names 
at [Source: [email protected]; 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] 

Dank

+0

Vergewissern Sie sich, dass Sie Client sendet 'null' anstatt die leere Zeichenkette, wenn es nicht ein vale weiß für das Attribut "Geschlecht". –

Antwort

0

Verwenden @JsonInclude (JsonInclude.Include.NON_EMPTY) mit Immobilien Sex. Es behandelt leere Zeichenfolge Wert.

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

Ich hoffe, dass dies Ihnen helfen kann.

0

Ich denke, dass es zwei Probleme in Ihrem Code gibt: Erstens ist Ihre getType() -Methode in Klasse enum Sex falsch. Es ist die Rückkehr MAN.getType(), die sich selbst nennen, so dass Infinitiv-Schleife verursachen. Vielleicht möchten Sie den Fall erfassen, dass null für enum zugewiesen ist, aber es ist nicht der richtige Weg.

Zweitens, der Grund, der direkt auf Ihr Problem in der Protokolldatei bezogen ist, kann keinen Null- oder Leerwert für den Aufzählungstyp zuweisen. denke ich Verwendung @JsonIgnoreProperties und DeserializationFeature.READ_UNKNOWN_ENUM_VALUES_AS_NULL ist der beste Weg, um Ihr Problem zu lösen den Pfosten Siehe hier: How to ignore enum fields in Jackson JSON-to-Object mapping?