Verhindern Sie, dass NewtonSoft Json nachgestellte 0 hinzufügt [doppelt]

Dec 01 2020

Ich habe ein unerwartetes Problem mit der NewtonSoft.JsonBibliothek. Es scheint, dass Dezimalwerten, die keinen Dezimalteil haben, eine nachfolgende 0 hinzugefügt wird:

JsonConvert.SerializeObject(1m)

Gibt die folgende Zeichenfolge zurück : "1.0".

Obwohl dies in vielen Fällen kein Problem darstellt, ist mir in meinem Fall die Präzision der Benutzer wichtig. Wenn ein Benutzer eintritt 1, muss ich 1in meiner Datenbank speichern. Wenn er zur Verfügung stellt, muss 1.0ich speichern 1.0.

Ich verwende die letzte Version der Bibliothek : 12.0.3, aber ich habe es mit allen vorherigen Hauptversionen bis auf 9.0.1versucht, und alle führen zum gleichen Ergebnis.

Ich habe mehrere Fragen zum Entfernen der nachfolgenden 0 durch die Bibliothek gesehen (als Fehler gemeldet, in Version 11.X behoben), aber keine zum Hinzufügen einer.

Ist das ein Fehler, den ich melden sollte? Wie kann ich dieses Standardverhalten überschreiben?

Antworten

1 DavidG Dec 01 2020 at 15:55

Es ist kein Fehler, so funktioniert die Bibliothek. Wenn Sie dieses Verhalten überschreiben möchten, benötigen Sie einen benutzerdefinierten Typkonverter, zum Beispiel:

public class DecimalJsonConverter : JsonConverter<decimal>
{
    public override decimal ReadJson(JsonReader reader, Type objectType, 
        decimal existingValue, bool hasExistingValue, JsonSerializer serializer)
    {
        throw new NotImplementedException();
    }

    public override void WriteJson(JsonWriter writer, 
        decimal value, JsonSerializer serializer)
    {
        // Customise how you want the decimal value to be output in here
        // for example, you may want to consider culture
        writer.WriteRawValue(value.ToString());
    }
}

Und jetzt serialisieren Sie so:

var settings = new JsonSerializerSettings
{
    Converters = new[] { new DecimalJsonConverter() }
};

var json = JsonConvert.SerializeObject(1m, settings);