2014-11-02 9 views
7

Ich kämpfe derzeit mit Java JSON Deserialisierung mit Jackson auf folgende Weise:Wie Jackson InvalidFormatException anmutig behandelt?

Ich mag eine JSON-Antwort verarbeiten und deserialisieren ich von einem Webservice bekommen und die Antwort in POJOs mit Hilfe von Jackson zu konvertieren. Dies funktioniert die meiste Zeit, solange die Antwort, die ich erhalte, JSON-Attribute im richtigen Format enthält.

Da jedoch der Webservice und die gelieferten Daten außerhalb meiner Kontrolle sind, kann ich mich nicht darauf verlassen, dass die Daten immer im richtigen Format sind.

Lassen Sie mich Ihnen ein Beispiel geben:

In meinem POJO, gibt es ein java.util.Date Feld, und die JSON-Antwort enthält eine Eigenschaft eines Datetime-Zeichenfolge zu halten. Jackson wird versuchen, die Saite zu analysieren und in eine Date umzuwandeln. Wenn das Datumsformat mit dem ObjectMapper's Datumsformat (ObjectMapper.setDateFormat(...)) übereinstimmt, ist alles in Ordnung. Wenn das Format anders ist, bekomme ich eine InvalidFormatException.

Das Problem ist jetzt, das Datumsformat, das vom Service gesendet wird, kann abweichen. Ich kann Daten erhalten, die wie 2014-11-02T00:00:00Z formatiert sind, aber ich kann auch Daten erhalten, die wie 2014-11 formatiert werden (das Identifizieren gerade eines einzelnen Monats anstelle eines vollständigen datetime).

Ich weiß, ich kann einen benutzerdefinierten Deserializer schreiben, der sich um genau diesen Fall kümmern und Datumszeichenfolgen mit verschiedenen Datumsformaten korrekt verarbeiten kann. Aber da dies nur Probleme mit Dates beheben würde, aber nicht mit möglichen anderen Datentypen, suche ich nach einem allgemeineren Ansatz. (Was zum Beispiel passiert, wenn ich einen Doppel und erhalten Sie eine alphanumerische Zeichenfolge erwarten?)

Was ich die Möglichkeit haben möchte, ist auf alle Fälle, in denen ein InvalidFormatException geschieht zu ignorieren und einen Standardwert (wie null) an die definieren jeweiliges POJO-Feld.

Und es wäre für mich sehr wertvoll sein, wenn trotz eines ungültigen Datumsformat zurückgegeben wird oder andere InvalidFormatException geschieht, die Rest des JSON würde noch in die POJO deserialisiert werden.

Ist dies in irgendeiner Weise mit Jackson möglich?

Vielen Dank für das Lesen meiner Frage bis zum Ende und ich wäre dankbar für alle Hinweise in die richtige Richtung.

+0

Ich mag würde auch die besten Praktiken kennen. – kai

Antwort

0

Nicht sicher, ob dies die beste Praxis ist, habe ich wenig Erfahrung mit Jackson.

Sie können dem ObjectMapper einen DeserializationProblemHandler hinzufügen, um anzugeben, was passiert, wenn der Deserializer auf eine merkwürdige Zeichenfolge oder eine seltsame Zahl stößt.

In Ihrem Fall der Handler einstellen könnte, dass, wenn ein unbekanntes Format zu begegnen, anstatt eine InvalidFormatException zu werfen, es gibt nur null:

ObjectMapper objectMapper = new ObjectMapper(); 
objectMapper.addHandler(new DeserializationProblemHandler() { 
    @Override 
    public Object handleWeirdStringValue(DeserializationContext ctxt, Class<?> targetType, String valueToConvert, String failureMsg) throws IOException { 
     return null; 
    } 

    @Override 
    public Object handleWeirdNumberValue(DeserializationContext ctxt, Class<?> targetType, Number valueToConvert, String failureMsg) throws IOException { 
     return null; 
    } 
});