2013-06-28 8 views
5

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.

+0

È necessario includere il testo di taglie sulla domanda, poiché è rilevante per rispondere correttamente. –

+0

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. –

+0

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 –

risposta

1

La soluzione seguente ha funzionato sia sugli oggetti di raccolta Elenco che su quelli Mappa, potrebbe funzionare anche sul tuo.

@JsonDeserialize(contentAs=MyObject.class) 
private List<MyObject> myObject = ListUtils.lazyList(new ArrayList(), {new MyObject()} as Factory);