Ich verwende Jackson bei der Entwicklung der Web-API mit SpringBoot, hatte jedoch ein Problem bei der Rückgabe eines BigDecimal-Typwerts als Antwort.
Das heißt, es wird mit aufeinanderfolgenden Nullen nach dem verbleibenden Dezimalpunkt angezeigt.
Angenommen, der Wert "99.9" ist in der Spalte des numerischen Typs (10, 5) von PostgresSQL registriert. Wenn Sie diesen Wert erhalten und in JSON zurückgeben, wird er als "99.90000" angezeigt, wenn Sie ihn als BigDecimal-Typ behandeln und zurückgeben. Ich werde.
Dieses Mal habe ich dieses Problem gelöst und einen Artikel geschrieben.
Erstellen Sie zunächst einen Serializer für den BigDecimal-Typ, z. B. BigDecimalSerializer.java (siehe unten). Zum Zeitpunkt der Erstellung muss die Klasse "StdSerializer" geerbt und die Zielklasse für die Bearbeitung des Werts in den Generika angegeben werden.
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()));
}
}
In der Methode "serialize" können Sie mithilfe der Methode "writeNumber" der Klasse "JsonGenerator" angeben, welche Art von Wert in einen Wert vom Typ "BigDecimal" konvertiert werden soll.
Dieses Mal habe ich die stripTrailingZeros
Methode der BigDecimal
Klasse verwendet, um die Nullen nach dem Dezimalpunkt zu entfernen.
Diese Methode scheint jedoch auch in Official Documentation enthalten zu sein. Wenn Sie es beispielsweise für 600.0 verwenden, ist das Ergebnis 6E2 und Indexmarkierung.
Daher ist das Format bei Verwendung der Methode "toPlainString" der Klasse "BigDecimal" nicht exponentiell.
Wenn Sie danach die Annotation "JsonSerialize" mit der zuvor erstellten Klasse "BigDecimalSerializer" in das Feld der Klasse einfügen, die als Antwort zurückgegeben werden soll, wird sie mit der 0 angezeigt, nachdem der Dezimalpunkt entfernt wurde.
CalculationResult.java
public class CalculationResult {
@JsonSerialize(using = BigDecimalSerializer.class)
private BigDecimal value;
}
Sie können Ihren eigenen Serializer erstellen, indem Sie eine Klasse erstellen, die von der Klasse "StdSerializer" erbt, und die Konvertierungslogik in die Methode "serialize" schreiben.
Sie können den zurückzugebenden Wert anpassen, indem Sie die Annotation "JsonSerialize" zum Feld der Klasse hinzufügen, die als Antwort zurückgegeben werden soll, und den erstellten Serializer angeben.
Ich hoffe dieser Artikel hilft jemandem.
Bis zum Ende Danke fürs Lesen.
So passen Sie den Serializer an https://www.baeldung.com/jackson-custom-serialization
Über 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