Est-il possible: d'avoir un champ dans la classe, mais des noms différents pour celui-ci lors de la sérialisation / désérialisation dans la bibliothèque Jackson?
Par exemple, j'ai la classe "Coordiantes".
class Coordinates{
int red;
}
Pour la désérialisation de JSON, vous voulez avoir un format comme celui-ci:
{
"red":12
}
Mais quand je sérialiserai un objet, le résultat devrait être comme celui-ci:
{
"r":12
}
J'ai essayé de l'implémenter en appliquant une @JsonProperty
annotation à la fois sur getter et setter (avec des valeurs différentes):
class Coordiantes{
int red;
@JsonProperty("r")
public byte getRed() {
return red;
}
@JsonProperty("red")
public void setRed(byte red) {
this.red = red;
}
}
mais j'ai une exception:
org.codehaus.jackson.map.exc.UnrecognizedPropertyException: champ non reconnu "rouge"
Vous pouvez utiliser
@jsonAlias
ce qui a été introduit dans jackson 2.9.0Exemple:
Cela utilise
r
pendant la sérialisation, mais permetred
comme alias pendant la désérialisation.r
Cependant, cela permet toujours d'être désérialisé.la source
has no effect during serialization where primary name is always used
. Ce n'est pas ce que veut le PO.r
comme nom principal, maisred
pour le@JsonAlias
, ce qui permet de le sérialiserr
, mais ajoutered
à être reconnu lors de la désérialisation. L'annoter avec@JsonProperty("r")
et@JsonAlias("red")
devrait également fonctionner correctement pour le problème donné.Vous pouvez utiliser une combinaison de @JsonSetter et @JsonGetter pour contrôler respectivement la désérialisation et la sérialisation de votre propriété. Cela vous permettra également de conserver des noms de méthode getter et setter normalisés qui correspondent à votre nom de champ réel.
la source
Je lierais deux paires getters / setters différentes à une variable:
la source
@JsonGetter
et@JsonSetter
. On peut donc définir exactement comment le sérialiseur se comportera.Il est possible d'avoir une paire getter / setter normale. Il vous suffit de spécifier le mode d'accès dans
@JsonProperty
Voici le test unitaire pour cela:
J'ai eu la sortie comme suit:
la source
Ce n'était pas ce à quoi je m'attendais en tant que solution (bien que ce soit un cas d'utilisation légitime). Mon exigence était de permettre à un client buggy existant (une application mobile déjà publiée) d'utiliser des noms alternatifs.
La solution consiste à fournir une méthode de définition distincte comme celle-ci:
la source
Je sais que c'est une vieille question, mais pour moi, je l'ai fait fonctionner quand j'ai compris que c'était en conflit avec la bibliothèque Gson, donc si vous utilisez Gson, utilisez
@SerializedName("name")
au lieu d'@JsonProperty("name")
espérer que cela aidela source
Annoter avec
@JsonAlias
qui a été introduit avec Jackson 2.9+, sans mentionner@JsonProperty
l'élément à désérialiser avec plus d'un alias (noms différents pour une propriété json) fonctionne bien.J'ai utilisé
com.fasterxml.jackson.annotation.JsonAlias
pour la cohérence du package aveccom.fasterxml.jackson.databind.ObjectMapper
pour mon cas d'utilisation.Par exemple:
fonctionne très bien.
la source
Ils doivent avoir inclus cela comme une fonctionnalité, car maintenant la définition d'un différent
@JsonProperty
pour un getter et un setter donne exactement ce que vous attendez (nom de propriété différent pendant la sérialisation et la désérialisation pour le même champ). Jackson version 2.6.7la source
Vous pouvez écrire une classe de sérialisation pour ce faire:
la source