[JAVA] [Jackson] Eine Geschichte über das Konvertieren des Rückgabewerts des Big Decimal-Typs mit einem benutzerdefinierten Serializer.

Einführung

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.

Lösung

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

Zusammenfassung

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.

Verweise

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

[Jackson] Eine Geschichte über das Konvertieren des Rückgabewerts des Big Decimal-Typs mit einem benutzerdefinierten Serializer.
Eine Geschichte über das Erreichen der League Of Legends-API mit JAVA
Über die Behandlung von BigDecimal (mit Reflexion)
Deklarieren Sie eine Methode mit einem Java-Rückgabewert mit dem Rückgabewert-Datentyp
Die Geschichte, einen Reverse-Proxy mit ProxyServlet zu erstellen
Eine Geschichte voller Grundlagen von Spring Boot (gelöst)
[Rails] Sprechen Sie darüber, wie Sie auf den Rückgabewert von where achten
Eine Geschichte, die mit der Einführung von Web Apple Pay zu kämpfen hatte
Die Geschichte eines Othello-Spiels vom Kommunikationstyp mit Scala.
Monade ist ein Entwurfsmuster, um "das Vorhandensein von Nebenwirkungen in einer Methode mit einem Rückgabetyp auszudrücken".
Die Geschichte eines Game Launcher mit automatischer Ladefunktion [Java]
Die Geschichte der Begegnung mit Spring Custom Annotation
Eine Geschichte über das JDK in der Java 11-Ära
Die Geschichte der Optimierung der Android-App mit libGDX
Eine Geschichte über das Erstellen eines Builders, der den Builder erbt
Geben Sie den Standardwert mit @Builder of Lombok an
Schreiben Sie einen Test, indem Sie die Geschichte von Mr. Nabeats in der Welt mit Rubin umsetzen
Übergeben Sie ein Argument an die Methode und erhalten Sie das Ergebnis der Operation als Rückgabewert
Beispielcode zum Zuweisen eines Werts in der Eigenschaftendatei zu einem Feld des erwarteten Typs
[PHP] Geschichte der Ausgabe von PDF mit TCPDF + FPDI
Eine Geschichte über den Versuch, mit Mockito auszukommen
Zeigen Sie den Durchschnittswert der Bewertung als Stern an
Eine Geschichte über die Reduzierung des Speicherverbrauchs auf 1/100 mit find_in_batches
Eine Geschichte über die Einführung von Evolutions in das Play Framework
Eine Geschichte über die Entwicklung von ROS namens Rosjava mit Java
Die Geschichte von dto, dao-like mit Java, SQLite
Eine Geschichte darüber, wie catkin_make von Rosjava offline kompatibel gemacht wird
Die Geschichte, wie ein Docker-Container mit GitHub-Aktionen in die GitHub-Paketregistrierung und den Docker-Hub verschoben wird
Die Geschichte des Erstellens einer Java-Version des Minecraft-Servers mit GCP (und dem Festlegen einer weißen Liste)
Ich möchte mit Java8 StreamAPI redu () einen anderen Typ als das Eingabeelement zurückgeben.
[Erster Beitrag] Eine Geschichte über einen zweiten neuen Absolventen der Universität für Leibeserziehung, der ein unerfahrener Programmierer wird
Eine Geschichte, die mich während des Komponententests von der impliziten Typkonvertierung von ActiveRecord abhängig machte
[Automatischer Handel mit Bitcoin] Eine Geschichte über den Betrieb mit Docker unter AWS mit ON / OFF- und Line-Benachrichtigung mit 1 TAP von Apple Watch für unterwegs