Quando si deserializza una varietà di messaggi JSON, si desidera fornire un valore predefinito per gli attributi di un determinato tipo. È generally suggested specificare semplicemente il valore nella Classe, ma questo è soggetto a errori se si deve fare questo attraverso molte Classi. Potresti dimenticarne uno e finire con null
invece di un valore predefinito. La mia intenzione è di impostare ogni proprietà che sia un Optional<T>
a Optional.absent
. Dal null
è esattamente ciò che sta cercando di eliminare Optional
, usandoli con Jackson si è dimostrato frustrante.Valori predefiniti impliciti durante la deserializzazione di JSON utilizzando Jackson
La maggior parte delle funzioni di Jackson che consentono di personalizzare il focus del processo di deserializzazione sul JSON che è l'input, non attorno al processo di creazione dell'istanza dell'oggetto in cui si sta deserializzando. Il più vicino che sembra di arrivare a una soluzione generale è di costruire il mio ValueInstantiator
, ma ci sono due questioni in sospeso che ho:
- come faccio a farlo istanziare solo
Optional
comeabsent
ma non interferire con il resto del il processo di istanziazione? - come collegare il risultato finale al mio
ObjectMapper
?
UPDATE: Ci tengo a precisare che sto cercando una soluzione che fa non prevedono la modifica ogni Class che contiene Optional
's. Sono contrario a violare il principio di ASCIUTTO. Io oi miei colleghi non dovremmo pensare di dover fare qualcosa in più ogni volta che aggiungiamo Optional
a una Classe nuova o esistente. Voglio essere in grado di dire, "rendere ogni campo facoltativo in ogni classe in cui deserializza, pre-riempito con Absent
", solo una volta e con esso.
Ciò significa che i seguenti sono fuori:
- astratta classe genitore (necessità di dichiarare)
- personalizzati Builder/Creator/JsonDeserializer (ha bisogno di annotazioni su ogni classe applicabile)
- Mixin di? Ho provato questo, combinato con la riflessione, ma non so come accedere alla classe Mi sto mescolando in ...
Il problema con questo è che 'deserialize()' non viene chiamato se l'attributo non è nel JSON. Voglio che vengano mappati anche a 'Optional.Absent'. –
Mi dispiace, ho perso quella parte. Aggiungo un paragrafo alla fine della mia risposta per suggerire un modo in cui l'ho fatto. –
Meglio, ma poi dovrei ancora annotare ogni classe che ha proprietà Opzionali. Voglio che sia trasparente. –