Différents noms de JSON à la propriété au cours de la sérialisation et de désérialisation
Est-il possible de: d'avoir un champ dans la classe, mais des noms différents pour elle au cours de la sérialisation/désérialisation de Jackson bibliothèque?
Par exemple, j'ai la classe "Coordiantes".
class Coordinates{
int red;
}
Pour la désérialisation de JSON voulez avoir format comme ceci:
{
"red":12
}
Mais quand je vais sérialiser un objet, résultat devrait ressembler à ceci:
{
"r":12
}
J'ai essayé de le mettre en application @JsonProperty
annotation à la fois sur les méthodes 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 je suis une exception:
org.codehaus.jackson.carte.exc.UnrecognizedPropertyException: Unrecognized champ "rouge"
Vous devez vous connecter pour publier un commentaire.
Viens de tester et cela fonctionne:
L'idée est que les noms de méthode doivent être différents, de sorte que jackson l'analyse que les différents champs, non pas comme un champ.
Voici un code de test:
Résultat:
Vous pouvez utiliser @jsonAlias qui s'est introduit dans jackson 2.9.0
Exemple:
has no effect during serialization where primary name is always used
. Ce n'est pas ce que l'OP veut.r
comme nom principal, maisred
pour la@JsonAlias
, ce qui permet de sérialiserr
, mais ajoutered
pour être reconnu sur la désérialisation. En annotant avec@JsonProperty("r")
et en outre@JsonAlias("red")
devrait fonctionner correctement pour le problème donné.Je voudrais lier deux getters/setters paire à une seule variable:
Vous pouvez utiliser une combinaison de @JsonSetter, et @JsonGetter de contrôle de la désérialisation, et la sérialisation de votre propriété, respectivement.
Ce n'était pas ce que j'attendais comme une solution (si elle est légitime de cas d'utilisation). Mon exigence était de permettre à un existant buggy client (une application mobile qui a déjà sorti) à utiliser d'autres noms.
La solution réside dans la fourniture distincte méthode setter comme ceci:
Il est possible d'avoir la normale getter/setter de la paire. Vous avez juste besoin de spécifier le mode d'accès dans
@JsonProperty
Ici est l'unité de test pour que:
J'ai eu de la sortie comme suit:
Ils doivent avoir inclus cette fonctionnalité, parce que maintenant la définition d'un autre
@JsonProperty
pour un getter et setter, vous obtiendrez exactement ce que vous attendez (autre nom de la propriété au cours de la sérialisation et de désérialisation pour le même champ). Jackson version 2.6.7Vous pouvez écrire un sérialiser une classe pour le faire:
Je sais que c'est une vieille question, mais pour moi j'ai eu de travail, lorsque j'ai compris que son conflit avec Gson bibliothèque donc, si vous utilisez Gson ensuite utiliser
@SerializedName("name")
au lieu de@JsonProperty("name")
espère que cette aide