Serialize ein Doppel auf 2 Dezimalstellen mit Jackson
Ich bin mit Jackson
mit Spring MVC
zu schreiben, die einige einfache Objekte wie JSON
. Eines der Objekte, hat eine amount
Eigenschaft, der Art Double
. (Ich weiß, dass Double
sollte nicht verwendet werden als Geldbetrag. Jedoch, dies ist nicht mein code.)
In der JSON
Ausgabe möchte ich einschränken, um die Menge auf 2 Dezimalstellen. Derzeit ist es wie folgt angezeigt:
"amount":459.99999999999994
Ich habe versucht, mit Feder 3 ist @NumberFormat
Anmerkung, aber hatte noch nicht den Erfolg in dieser Richtung. Sieht aus wie andere hatten Fragen zu: MappingJacksonHttpMessageConverter ist ObjectMapper nicht verwenden ConversionService beim binden von JSON zu JavaBean-propertiesenter link-Beschreibung hier.
Auch, ich habe versucht mit der @JsonSerialize
annotation, mit der eine benutzerdefinierte serializer.
Im Modell:
@JsonSerialize(using = CustomDoubleSerializer.class)
public Double getAmount()
- Und serializer-Implementierung:
public class CustomDoubleSerializer extends JsonSerializer<Double> {
@Override
public void serialize(Double value, JsonGenerator jgen, SerializerProvider provider) throws IOException, JsonGenerationException {
if (null == value) {
//write the word 'null' if there's no value available
jgen.writeNull();
} else {
final String pattern = ".##";
//final String pattern = "###,###,##0.00";
final DecimalFormat myFormatter = new DecimalFormat(pattern);
final String output = myFormatter.format(value);
jgen.writeNumber(output);
}
}
}
Den CustomDoubleSerializer
"scheint" zu funktionieren. Jedoch kann jeder jeden schlagen jede andere, einfachere (oder mehr standard -) Möglichkeit dies zu tun.
InformationsquelleAutor der Frage mlo55 | 2012-07-17
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich hatte eine ähnliche situation in meinem Projekt. Ich habe dazu den code zur Formatierung der setter-Methode des POJO. DecimalFormatter, Mathematik und andere Klassen endete rundet den Wert, aber meine Anforderung war nicht rundet den Wert aber nur beschränkt die Anzeige auf 2 Nachkommastellen.
Ich neu in diesem Szenario.
Produkt ist ein POJO-das hat ein Mitglied
Double amount
.JavaToJSON ist eine Klasse, erstellen eine Instanz von Produkt-und konvertieren es zu JSON.
Der setter
setAmount
imProduct
kümmern Formatierung auf 2 Nachkommastellen.Hier ist der vollständige code.
Product.java
JavaToJSON.java
Habe ich noch nicht genug Punkte gesammelt, so bin ich nicht in der Lage, um mit dem hochladen der screenshots, um zu zeigen Sie die Ausgabe.
Hoffe, das hilft.
InformationsquelleAutor der Antwort Dinesh Chitlangia
In der Tat, es sollte nicht.
BigDecimal
ist eine viel bessere Wahl für die Speicherung von Geldbeträgen, denn es ist lossless und bietet mehr Kontrolle der Dezimalstellen.Also für Menschen, die haben die Kontrolle über den codees kann z.B. so verwendet werden:
Dass serialisieren als
111.22
. Keine benutzerdefinierten serialisierungsprogramme benötigt.InformationsquelleAutor der Antwort rustyx
Bezug auf das, was war angegeben vor, ich wollte nur mal fix ein bisschen was, so dass die Menschen keine Zeit verschwenden auf, wie ich es Tat. Sollte man eigentlich verwenden
statt
- und das ist eigentlich irgendwie kritisch. Denn wenn Sie nicht, Ihre Dezimalzahl wird verhunzt werden. Dies ist eine Einschränkung von floating-point-Darstellung, wie bereits hier.
InformationsquelleAutor der Antwort Olivier B.
Beachten Sie, dass 459.99999999999994 ist effektiv 460 und erwartet serialisiert werden auf diese Weise. Also, Ihre Logik sollte kniffliger, als einfach nur fallen stellen.
Ich könnte vorschlagen, etwas wie:
Möchten Sie vielleicht, um es in die Set-und get-rid-of custom Serialisierung.
InformationsquelleAutor der Antwort theme