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.
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;
}
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.
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