J'ai une classe Java MyPojo
que je souhaite désérialiser de JSON. J'ai configuré une classe MixIn spéciale MyPojoDeMixIn
, pour m'aider dans la désérialisation. MyPojo
a seulement int
et des String
variables d'instance combinées avec des getters et des setters appropriés. MyPojoDeMixIn
ressemble à quelque chose comme ceci:
public abstract class MyPojoDeMixIn {
MyPojoDeMixIn(
@JsonProperty("JsonName1") int prop1,
@JsonProperty("JsonName2") int prop2,
@JsonProperty("JsonName3") String prop3) {}
}
Dans mon client de test, je fais ce qui suit, mais bien sûr cela ne fonctionne pas au moment de la compilation car il y a un JsonMappingException
lié à une incompatibilité de type.
ObjectMapper m = new ObjectMapper();
m.getDeserializationConfig().addMixInAnnotations(MyPojo.class,MyPojoDeMixIn.class);
try { ArrayList<MyPojo> arrayOfPojo = m.readValue(response, MyPojo.class); }
catch (Exception e) { System.out.println(e) }
Je suis conscient que je pourrais atténuer ce problème en créant un objet "Response" qui ne contient qu'un seul objet ArrayList<MyPojo>
, mais je devrais alors créer ces objets quelque peu inutiles pour chaque type que je veux retourner.
J'ai également regardé en ligne JacksonInFiveMinutes, mais j'ai eu beaucoup de mal à comprendre le sujet Map<A,B>
et son lien avec mon problème. Si vous ne pouvez pas le dire, je suis entièrement nouveau sur Java et je viens d'un arrière-plan Obj-C. Ils mentionnent spécifiquement:
En plus de la liaison aux POJO et aux types "simples", il existe une variante supplémentaire: celle de la liaison à des conteneurs génériques (typés). Ce cas nécessite un traitement spécial en raison de ce qu'on appelle l'effacement de type (utilisé par Java pour implémenter des génériques d'une manière quelque peu rétrocompatible), qui vous empêche d'utiliser quelque chose comme Collection.class (qui ne compile pas).
Donc, si vous souhaitez lier des données dans une carte, vous devrez utiliser:
Map<String,User> result = mapper.readValue(src, new TypeReference<Map<String,User>>() { });
Comment puis-je désérialiser directement vers ArrayList
?
Réponses:
Vous pouvez désérialiser directement dans une liste à l'aide du
TypeReference
wrapper. Un exemple de méthode:Et s'utilise ainsi:
TypeRéférence Javadoc
la source
TypeReference
- je ne comprends tout simplement pas comment le faire ... Veuillez consulter ma modification ci-dessus pour obtenir des instructions sur l'utilisation des génériques.arrayList.toString()
environ unNullPointerException
. Je suppose que cela pourrait être dû au fait que monPOJO
n'est pas conforme aux bonnes conventions de dénomination pour ses propriétés, c'est-à-dire que tout le problème est que le service Web retourneProp1Member
et que mon objet l'aProp1
. C'est la seule vraie raison pour laquelle j'utilise des mixins pour commencer, donc je n'ai pas à mettre les déclarations pour@JsonProperty
dans mes objets purs.Une autre façon consiste à utiliser un tableau comme type, par exemple:
De cette façon, vous évitez tous les tracas avec l'objet Type, et si vous avez vraiment besoin d'une liste, vous pouvez toujours convertir le tableau en liste en:
IMHO c'est beaucoup plus lisible.
Et pour en faire une liste réelle (qui peut être modifiée, voir les limitations de
Arrays.asList()
), procédez comme suit:la source
TypeFactory
qu'en utilisant comme décrit dans la réponse suivante: stackoverflow.com/a/42458104/91497 est la manière Jackson de spécifier le type.Cette variante a l'air plus simple et élégante.
la source
J'ai aussi le même problème. J'ai un json qui doit être converti en ArrayList.
Le compte ressemble à ceci.
Toutes les classes ci-dessus ont été correctement annotées. J'ai essayé TypeReference> () {} mais ne fonctionne pas.
Cela me donne Arraylist mais ArrayList a un linkedHashMap qui contient des hashmaps plus liés contenant des valeurs finales.
Mon code est le suivant:
J'ai finalement résolu le problème. Je peux convertir la liste dans Json String directement en ArrayList comme suit:
la source
Cela fonctionne pour moi.
la source