2013-06-28 15 views
5

Ich habe ein Objekt, das eine org.apache.commons.collections.list.LazyList für eines seiner Felder verwendet, die JSON serialisiert ist. Die JSON sieht wie folgt aus:Deserialize Lazylist mit Jackson

 "myObject": ["org.apache.commons.collections.list.LazyList", [ 
      { 
       "attr1": "asdasd", 
       "attr2": 1234 
      } 
     ]], 

Das Objektfeld sieht wie folgt aus:

List<MyObject> myObject = ListUtils.lazyList(new ArrayList(), {new MyObject()} as Factory) 

jedoch die oben JSON mit einem Jackson ObjectMapper nicht deserialisiert versuchen, da es nicht über einen Standardkonstruktor finden können, eine LazyList - das macht Sinn. Aber wie kann ich angeben, wie dieses Feld deserialisiert werden kann?

Fehlermeldung:

Kein Standardkonstruktor für [Kollektionstyp; Klasse org.apache.commons.collections.list.LazyList, enthält [einfache Art, Klasse foo.bar.MyObject]]

Bounty-Einschränkungen:

die Prämie zu sammeln, diese Frage Bedürfnisse mit einem benutzerdefinierten Jacksons Deserializer beantwortet werden - der benutzerdefinierte Deserializer darf nicht feldspezifisch sein! Daher wird keine Lösung, die benutzerdefinierte Implementierungen einer LazyList für einen bestimmten Typ verwendet, diese Frage angemessen beantworten.

+0

Sie sollten den Kopfgeldtext zu der Frage hinzufügen, da es relevant ist, sie richtig zu beantworten. –

+0

Es gibt keine Möglichkeit, dies zu 100% mit allem kompatibel zu machen. Da Daten verloren gehen, müssen Sie Annahmen treffen, z. B. die Unterstützung der List-Implementierung und -Factory von LazyList. Die einzige Möglichkeit, dies zu tun, ohne diese Annahmen zu treffen, besteht darin, diese Informationen irgendwie zu der serialisierten JSON hinzuzufügen. Sie können Ihren eigenen Serializer schreiben, um Reflektion zu verwenden, um diese Information hinzuzufügen, und Deserializer, um diese Information zu verwenden (wieder unter Verwendung der Reflektion), erstellen Sie das LazyList-Objekt, aber Sie machen immer noch Annahmen, zB dass Ihre Fabriken 0-Arg-Konstruktoren haben. –

+0

Führen Sie eine Google-Suche nach "Java Reflection" durch und verwenden Sie diese, um die geschützten Variablen 'collection' und' factory' für Ihren Serializer und die Konstruktoren für Ihren Deserializer zu erhalten. Oder sehen Sie sich andere Fragen an, zum Beispiel: http://stackoverflow.com/questions/735230/java-reflection –

Antwort

1

Die folgende Lösung funktionierte sowohl für Listen- als auch für Kartensammlungsobjekte, möglicherweise auch für Ihre.

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