J'ai ce problème spécifique avec la désérialisation JSON. Ayons cette structure JSON:Jackson: désérialisation à une collection
{
"header":{
"objects":[
{"field":"value1"},
{"field":"value2"}
]
}
}
La structure JSON ne peut pas être modifiée car elle provient d'un système tiers.
Maintenant, nous allons avoir ce simple POJO:
@JsonDeserialize(using=PojoDeserializer.class)
public class Pojo {
private string field;
//...getter, setter
}
Le PojoDeserializer mentionné prend { "champ": "valeur"} chaîne JSON et désérialise à l'instance Pojo. Donc, je peux tout simplement faire la désérialisation comme celui-ci
Pojo instance = new ObjectMapper() readValue ("{\" champ \ ": \" valeur \ "}", Pojo.class);.
Et voici mon problème. Prenons un autre deserializer PojosCollectionDeserializer qui prend la structure mentionnée et la désérialise en une collection d'instances Pojo. Je voudrais l'utiliser de la même manière que dans l'exemple précédent:
Collection<Pojo> pojos = new ObjectMapper().readValue("{...}", Collection.class);
Mais cela ne fonctionne pas comme il n'y a pas défini cette collection doit être créée en utilisant l'PojosCollectionDeserializer. Y a-t-il un moyen de l'atteindre?
Comment Jackson sait-il instancier des instances 'Pojo' pour la collection' List objects; Avec effacement de type d'exécution, je ne suis pas sûr de savoir comment il serait en mesure de le faire. Des idées? –
L'effacement de type n'est pas terminé à 100%: les déclarations de classe conservent les informations de type générique pour les déclarations de méthode et de champ, ainsi que pour les déclarations de sous-type ("extends Xxx"). Le problème se produit lors du passage des objets de classe; il y a juste List.class, et pas de "List .class" grâce à l'effacement du type. –
StaxMan