Ho un oggetto che utilizza uno org.apache.commons.collections.list.LazyList
per uno dei suoi campi, che è serializzato in JSON. Il JSON è simile al seguente:deserialize lazylist using jackson
"myObject": ["org.apache.commons.collections.list.LazyList", [
{
"attr1": "asdasd",
"attr2": 1234
}
]],
Il campo oggetto si presenta così:
List<MyObject> myObject = ListUtils.lazyList(new ArrayList(), {new MyObject()} as Factory)
Tuttavia il tentativo di deserializzare il JSON sopra utilizzando un Jackson ObjectMapper fallisce, dal momento che non riesce a trovare un costruttore di default per a LazyList - che ha senso. Ma come posso specificare in che modo questo campo può essere deserializzato?
Messaggio di errore:
Nessun costruttore predefinito per [tipo di raccolta; Classe org.apache.commons.collections.list.LazyList, contiene [tipo semplice, classe foo.bar.MyObject]]
Bounty-vincoli:
per raccogliere la bontà, questa questione deve per rispondere con un deserializzatore jackson personalizzato - il deserializzatore personalizzato non deve essere specifico del campo! Quindi nessuna soluzione che utilizzi implementazioni personalizzate di LazyList per un tipo specifico risponderà adeguatamente a questa domanda.
È necessario includere il testo di taglie sulla domanda, poiché è rilevante per rispondere correttamente. –
Non c'è modo di renderlo compatibile al 100% con tutto. Poiché i dati vengono persi, è necessario formulare ipotesi, come l'implementazione dell'elenco di backup di LazyList e la factory. L'unico modo per farlo senza fare questi presupposti è aggiungere le informazioni al JSON serializzato in qualche modo. È possibile scrivere il proprio serializzatore per utilizzare la riflessione per aggiungere tali informazioni e deserializzatore per utilizzare tali informazioni per (di nuovo, utilizzando la riflessione) creare l'oggetto LazyList, ma si stanno ancora formando ipotesi, ad esempio che le proprie fabbriche abbiano costruttori 0-arg. –
Fai una ricerca su google per "java reflection" e usalo per ottenere le variabili 'collection' e' factory' protette per il tuo serializzatore e i costruttori per il tuo deserializzatore. Oppure vedi altre domande di aiuto, come: http://stackoverflow.com/questions/735230/java-reflection –