2013-06-28 5 views
5

J'ai un objet qui utilise un org.apache.commons.collections.list.LazyList pour l'un de ses champs, qui est sérialisé à JSON. Le JSON ressemble à ceci:désérialiser lazylist en utilisant jackson

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

Le champ d'objet ressemble à ceci:

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

Cependant essayer de désérialiser le JSON ci-dessus en utilisant un Jackson ObjectMapper échoue, car il ne peut pas trouver un constructeur par défaut un LazyList - qui a du sens. Mais comment puis-je spécifier comment ce champ peut être désérialisé?

Message d'erreur:

Aucun constructeur par défaut pour [type de collection; classe org.apache.commons.collections.list.LazyList, contient [type simple, classe foo.bar.MyObject]]

Bounty-contraintes:

recevoir votre prime, cette question des besoins pour être répondu en utilisant un désérialiseur jackson personnalisé - le désérialiseur personnalisé ne doit pas être spécifique au champ! Par conséquent, aucune solution utilisant des implémentations personnalisées d'un LazyList pour un type spécifique ne répondra correctement à cette question.

+0

Vous devez inclure le texte de la prime à la question, car il est pertinent de répondre correctement. –

+0

Il n'y a aucun moyen de rendre ce 100% compatible avec tout. Puisque les données sont perdues, vous devez faire des suppositions, telles que l'implémentation et l'usine de la liste de sauvegarde de LazyList. La seule façon de le faire sans faire ces suppositions est d'ajouter cette information au JSON sérialisé en quelque sorte. Vous pouvez écrire votre propre sérialiseur pour utiliser la réflexion pour ajouter cette information, et désérialiser pour utiliser cette information pour (encore, en utilisant la réflexion) créer l'objet LazyList, mais vous faites encore des suppositions, comme que vos usines ont des constructeurs 0-arg. –

+0

Faites une recherche google pour "java reflection" et utilisez-la pour obtenir les variables protégées 'collection' et' factory' pour votre sérialiseur et les constructeurs pour votre désérialiseur. Ou consultez d'autres questions d'aide, telles que: http://stackoverflow.com/questions/735230/java-reflection –

Répondre

1

La solution ci-dessous a fonctionné sur les objets de collection List et Map, elle pourrait également fonctionner sur les vôtres.

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