[JAVA] [Jackson] Une histoire sur la conversion de la valeur de retour du type BigDecimal avec un sérialiseur personnalisé.

introduction

J'utilise Jackson dans le développement d'API Web à l'aide de SpringBoot, mais j'ai rencontré un problème lors du renvoi d'une valeur de type BigDecimal en réponse.

Autrement dit, il est affiché avec des 0 consécutifs après le point décimal restant.

Par exemple, en supposant que la valeur «99,9» est inscrite dans la colonne de type numérique (10, 5) de PostgresSQL, si vous obtenez cette valeur et la renvoyez en JSON, si vous la manipulez en tant que type BigDecimal et la renvoyez, elle sera affichée sous la forme «99,90000». Je vais.

Cette fois, j'ai résolu ce problème, j'ai donc écrit un article.

Solution

Tout d'abord, créez un sérialiseur pour le type BigDecimal, tel que BigDecimalSerializer.java ci-dessous. Au moment de la création, il est nécessaire d'hériter de la classe StdSerializer et de spécifier la classe cible pour manipuler la valeur dans les génériques.

BigDecimalSerializer.java


public class BigDecimalSerializer extends StdSerializer<BigDecimal> {

  public BigDecimalSerializer() {
    this(null);
  }

  public BigDecimalSerializer(Class<BigDecimal> c) {
    super(c);
  }

  @Override
  public void serialize(BigDecimal bigDecimal, JsonGenerator generator, SerializerProvider provider) throws IOException {
    generator.writeNumber(new BigDecimal(bigDecimal.stripTrailingZeros().toPlainString()));
  }
}

Dans la méthode serialize, vous pouvez spécifier le type de valeur à convertir en une valeur de type BigDecimal en utilisant la méthode writeNumber de la classe JsonGenerator.

Cette fois, j'ai utilisé la méthode stripTrailingZeros de la classe BigDecimal pour supprimer les 0 après la virgule décimale.

Cependant, cette méthode semble également être dans Documents officiels Par exemple, si vous l'utilisez pour 600.0, le résultat sera 6E2 et le marquage d'index.

Par conséquent, en utilisant la méthode toPlainString de la classe BigDecimal, le format n'est pas exponentiel.

Après cela, si vous ajoutez l'annotation JsonSerialize à l'aide de la classe BigDecimalSerializer créée précédemment dans le champ de la classe à renvoyer en tant que réponse, elle sera affichée avec le 0 après la suppression du point décimal.

CalculationResult.java


public class CalculationResult {
@JsonSerialize(using = BigDecimalSerializer.class)
private BigDecimal value;
}

Résumé

Vous pouvez créer votre propre sérialiseur en créant une classe qui hérite de la classe StdSerializer et en écrivant la logique de conversion dans la méthode serialize.

Vous pouvez personnaliser la valeur à renvoyer en ajoutant l'annotation JsonSerialize au champ de la classe à renvoyer en tant que réponse et en spécifiant le sérialiseur créé.

J'espère que cet article aide quelqu'un.

Jusqu'à la fin Merci d'avoir lu.

Les références

Comment personnaliser le sérialiseur https://www.baeldung.com/jackson-custom-serialization

À propos de toPlainString https://docs.oracle.com/javase/jp/11/docs/api/java.base/java/math/BigDecimal.html#toPlainString() https://qiita.com/shotana/items/e02357516798e6bc658e

Recommended Posts

[Jackson] Une histoire sur la conversion de la valeur de retour du type BigDecimal avec un sérialiseur personnalisé.
Une histoire sur l'utilisation de l'API League Of Legends avec JAVA
À propos du traitement de BigDecimal (avec réflexion)
Déclarez une méthode qui a une valeur de retour Java avec le type de données de valeur de retour
L'histoire de la création d'un proxy inverse avec ProxyServlet
Une histoire remplie des bases de Spring Boot (résolu)
[Rails] Parlez de prêter attention à la valeur de retour de l'endroit
Une histoire qui a eu du mal avec l'introduction de Web Apple Pay
L'histoire de la création d'un jeu d'Othello de type communication avec Scala.
Monad est un modèle de conception pour "exprimer l'existence d'effets secondaires dans une méthode avec un type de retour"
L'histoire de la création d'un lanceur de jeu avec une fonction de chargement automatique [Java]
L'histoire de la rencontre avec l'annotation personnalisée Spring
Une histoire sur le JDK à l'ère de Java 11
L'histoire du réglage de l'application Android avec libGDX
Une histoire sur la création d'un Builder qui hérite du Builder
Spécifiez la valeur par défaut avec @Builder of Lombok
Ecrire un test en mettant en œuvre l'histoire de M. Nabeats dans le monde avec du rubis
Passez un argument à la méthode et recevez le résultat de l'opération comme valeur de retour
Exemple de code pour attribuer une valeur dans le fichier de propriétés à un champ du type attendu
[PHP] Histoire de la sortie de PDF avec TCPDF + FPDI
Une histoire d'essayer de s'entendre avec Mockito
Afficher la valeur moyenne de l'évaluation sous forme d'étoile
Une histoire sur la réduction de la consommation de mémoire à 1/100 avec find_in_batches
Une histoire sur l'introduction d'Evolutions dans le cadre de jeu
Une histoire sur le développement de ROS appelé rosjava avec java
L'histoire de la création de DTO, semblable à Dao avec Java, SQLite
Une histoire de rendre catkin_make de rosjava compatible hors ligne
L'histoire du transfert d'un conteneur Docker vers le registre de packages GitHub et Docker Hub avec des actions GitHub
L'histoire de la création d'une version Java du serveur Minecraft avec GCP (et également de la création d'une liste blanche)
Je veux renvoyer un type différent de l'élément d'entrée avec Java8 StreamAPI Reduce ()
[Premier message] Une histoire sur un deuxième nouveau diplômé de l'Université d'éducation physique devenant un programmeur inexpérimenté
Une histoire dans laquelle j'étais accro à la conversion de type implicite d'ActiveRecord lors du test unitaire
[Trading automatique de Bitcoin] Histoire de fonctionnement avec Docker d'AWS, avec notification ON / OFF et ligne avec 1 TAP d'Apple Watch en déplacement