Comment désérialiser une classe avec des constructeurs surchargés à l'aide de JsonCreator
Je suis en train de désérialiser une instance de cette classe à l'aide de Jackson 1.9.10:
public class Person {
@JsonCreator
public Person(@JsonProperty("name") String name,
@JsonProperty("age") int age) {
//... person with both name and age
}
@JsonCreator
public Person(@JsonProperty("name") String name) {
//... person with just a name
}
}
Quand j'ai essayer ce que je reçois le
Conflit sur la propriété des créateurs: déjà eu ... {interface org.codehaus.jackson.annoter.JsonCreator @org.codehaus.jackson.annoter.JsonCreator()}], rencontrés ... , annotations: {interface org.codehaus.jackson.annoter.JsonCreator @org.codehaus.jackson.annoter.JsonCreator()}]
Est-il un moyen pour désérialiser une classe avec des constructeurs surchargés à l'aide de Jackson?
Grâce
- Comme la réponse de points, pas d', vous devez spécifier l'un et seul constructeur. Dans votre cas, laissez celui qui prend plusieurs arguments, qui fonctionnent très bien. "Manquant" arguments de prendre la valeur null (pour les Objets), ou la valeur par défaut (pour les primitives).
- Merci. Ce qui permet à plusieurs constructeurs serait une fonctionnalité intéressante cependant. En fait, mon exemple est un peu artificiel. L'objet que je suis en train d'utiliser, en réalité, a complètement différentes listes d'arguments, l'un est créé normalement, l'autre est créée avec un Throwable... je vais voir ce que je peux faire, peut-être avoir un constructeur vide et les getter / setter pour le Lancer
- Ouais, je suis sûr que ça serait bien, mais les règles peuvent devenir assez complexes avec différentes permutations. Toujours possible de déposer RFEs pour les nouvelles fonctionnalités, les caractéristiques.
Vous devez vous connecter pour publier un commentaire.
Bien que son pas correctement documenté, vous ne pouvez avoir qu'un seul créateur, par type. Vous pouvez avoir autant de constructeurs que vous le souhaitez dans votre type, mais un seul d'entre eux doit avoir un
@JsonCreator
annotation sur elle.- Il encore vrai pour Jackson databind 2.7.0.
La Jackson
@JsonCreator
annotation de 2,5 javadoc ou Jackson annotations de la documentation grammaire (constructeurs et de l'usine méthodes) laissent croire en effet que l'on peut marque plusieurs constructeurs.Regardant le code où la créateurs sont identifiés, il semble que Jackson
CreatorCollector
est ignorant constructeurs surchargés, car il ne vérifie le premier argument du constructeur.oldOne
est le premier constructeur créateur.newOne
est la surcharge de constructeur créateur.Qui signifie que le code comme ça ne fonctionne pas
Mais ce code fonctionne :
C'est un peu hacky et ne peut pas être l'avenir de.
La documentation est vague au sujet de la façon dont la création d'un objet de travaux; à partir de ce que je déduis de code bien, c'est qu'il est possible de mélanger différentes méthodes :
Par exemple on peut avoir une statique usine méthode annotée avec
@JsonCreator
Cela fonctionne, mais il n'est pas l'idéal. En fin de compte, il pourrait être intéressant, par exemple, si le json est que dynamique alors peut-être que l'on devrait chercher à utiliser un délégué constructeur pour gérer la charge utile des variations beaucoup plus élégamment que avec plusieurs annoté des constructeurs.
Également noter que Jackson les commandes des créateurs en priorité, par exemple, dans ce code :
Ce temps, Jackson ne lèvera une erreur, mais Jackson n'utilisera que les délégué constructeur
Phone(Map<String, Object> properties)
, cela signifie que lePhone(@JsonProperty("value") String value)
n'est jamais utilisé.Si j'a bien compris ce que vous essayez d'atteindre, vous pouvez le résoudre sans surcharge du constructeur.
Si vous voulez juste de mettre des valeurs null dans les attributs n'est pas présent dans un JSON ou une Carte, vous pouvez effectuer les opérations suivantes:
Qui a été mon cas quand j'ai trouvé votre question. Il m'a fallu un certain temps pour comprendre comment le résoudre, c'est peut-être ce que vous étiez en tring à faire.
@Brice solution ne fonctionne pas pour moi.
Si vous n'avez pas l'esprit de faire un peu plus de travail, vous pouvez désérialiser l'entité manuellement: