Existe-t-il un moyen d'utiliser le processeur Jackson JSON pour effectuer une sérialisation au niveau du champ personnalisé? Par exemple, j'aimerais avoir la classe
public class Person {
public String name;
public int age;
public int favoriteNumber;
}
sérialisé au JSON suivant:
{ "name": "Joe", "age": 25, "favoriteNumber": "123" }
Notez que age = 25 est codé comme un nombre tandis que favoriteNumber = 123 est codé comme une chaîne . Out of the box Jackson marshalls int
à un certain nombre. Dans ce cas, je veux que favoriteNumber soit encodé sous forme de chaîne.
java
json
serialization
jackson
Steve Kuo
la source
la source
Réponses:
Vous pouvez implémenter un sérialiseur personnalisé comme suit:
Java doit gérer l'autoboxing de
int
àInteger
pour vous.la source
as=String.class
est ignorée en raison duusing
paramètre et n'est pas requise ici. Remarque: si using () est également utilisé, il a la priorité (puisqu'il a directement spécifié le sérialiseur, alors que cela ne serait utilisé que pour localiser le sérialiseur) et la valeur de cette propriété d'annotation est ignorée.Person implements ToJson
?as=String.class
pièce, en raison des types que j'ai utilisés. @ kevin-bowersox, je suggère de mettre à jour votre commentaire, conformément à ce que @GarethLatty a dit.Jackson-databind (au moins 2.1.3) fournit special
ToStringSerializer
(com.fasterxml.jackson.databind.ser.std.ToStringSerializer
)Exemple:
la source
jackson-annotations fournit
@JsonFormat
qui peut gérer de nombreuses personnalisations sans avoir besoin d'écrire le sérialiseur personnalisé.Par exemple, la demande d'une
STRING
forme pour un champ de type numérique affichera la valeur numérique sous forme de chaînese traduira par la sortie souhaitée
la source
Ajoutez un
@JsonProperty
getter annoté, qui renvoie aString
, pour lefavoriteNumber
champ:la source
Si vous ne souhaitez pas polluer votre modèle avec des annotations et que vous souhaitez effectuer des opérations personnalisées, vous pouvez utiliser des mixins.
Remplacer l'âge:
Faites tout ce dont vous avez besoin avec l'âge:
la source
avec l'aide de @JsonView, nous pouvons décider des champs de classes de modèle à sérialiser qui satisfont les critères minimaux (nous devons définir les critères) comme nous pouvons avoir une classe de base avec 10 propriétés mais seulement 5 propriétés peuvent être sérialisées, ce qui est nécessaire pour le client seulement
Définissez nos vues en créant simplement la classe suivante:
Classe de modèle annotée avec vues:
Nous devons maintenant écrire un convertisseur json personnalisé en étendant simplement la classe HttpMessageConverter à partir de spring comme:
Maintenant, il est nécessaire de dire à spring d'utiliser cette conversion json personnalisée en la plaçant simplement dans dispatcher-servlet.xml
C'est ainsi que vous pourrez décider des champs à sérialiser.
la source