2014-11-02 16 views
7

che sto attualmente alle prese con Java JSON deserializzazione con Jackson nel seguente modo:Come gestire Jackson InvalidFormatException con garbo?

voglio elaborare e deserializzare una risposta JSON torno da un webservice e convertire la risposta in POJO, con l'aiuto di Jackson. Questo funziona bene la maggior parte del tempo, a patto che la risposta che sto ottenendo contenga gli attributi JSON nel formato corretto.

Come il servizio web ei dati forniti sono fuori dal mio controllo, non posso contare sul fatto che i dati siano sempre nel formato corretto.

Lasciate che vi faccia un esempio:

Nel mio POJO, c'è un campo java.util.Date, e la risposta JSON contiene una proprietà in possesso di uno stringa di datetime. Jackson tenterà di analizzare la stringa e convertirla in Date. Se il formato della data corrisponde al formato data ObjectMapper's (ObjectMapper.setDateFormat(...)), tutto è a posto. Se il formato è diverso, ottengo uno InvalidFormatException.

Il problema ora è che il dataformat inviato dal servizio può differire. Posso ottenere date formattate come 2014-11-02T00:00:00Z, ma posso anche ottenere date formattate come 2014-11 (identificando solo un mese invece di un intero datetime).

Lo so, posso scrivere un deserializzatore personalizzato che potrebbe occuparsi di questo caso esatto e gestire correttamente i datestring con diversi formati di data. Ma siccome questo risolverebbe solo problemi con Dates, ma non con potenziali altri tipi di dati, sto cercando un approccio più generale. (Che cosa accade ad esempio se mi aspetto un doppio e ricevo una stringa alfanumerica?)

Quello che vorrei è avere la possibilità di ignorare tutti i casi in cui un InvalidFormatException accade e definire un valore predefinito (come null) al rispettivo campo POJO.

E sarebbe veramente prezioso per me, se nonostante un dateformat non valida essere restituiti o qualsiasi altro InvalidFormatException accadendo, il resto della JSON sarebbe ancora essere deserializzato nel POJO.

È questo in qualsiasi modo possibile con Jackson?

Grazie per aver letto la mia domanda fino alla fine e sarei grato per ogni suggerimento nella giusta direzione.

+0

Mi piacerebbe sapere le migliori pratiche troppo. – kai

risposta

0

Non sono sicuro che si tratti di best practice, ho poca esperienza con Jackson.

È possibile aggiungere uno DeserializationProblemHandler allo ObjectMapper per specificare cosa accade quando il deserializzatore incontra una Stringa strana o un numero strano.

Nel tuo caso è possibile impostare il gestore in modo tale che quando incontra un formato non riconosciuto, invece di lanciare un InvalidFormatException, restituisce proprio nulla:

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; 
    } 
}); 
Problemi correlati