Zapobiegaj dodawaniu przez NewtonSoft Json końcowego 0 [duplikat]

Dec 01 2020

Mam niespodziewany problem z NewtonSoft.Jsonbiblioteką. Wygląda na to, że dodaje końcowe 0 do wartości dziesiętnych, które nie mają części dziesiętnej:

JsonConvert.SerializeObject(1m)

Zwróci następujący ciąg: "1.0".

Chociaż w wielu przypadkach nie stanowi to problemu, w moim przypadku zależy mi na precyzji, jaką zapewniają użytkownicy. Jeśli użytkownik wejdzie 1, muszę zapisać 1w mojej bazie danych. Jeśli on zapewnia 1.0, muszę przechowywać 1.0.

Używam ostatniej wersji biblioteki: 12.0.3ale próbowałem z wszystkimi poprzednimi wersjami głównymi aż do 9.0.1i wszystkie dają ten sam wynik.

Widziałem kilka pytań dotyczących usuwania przez bibliotekę końcowego 0 (zgłoszonego jako błąd, naprawiony w wersji 11.X), ale żadnego o dodaniu.

Czy to błąd, który powinienem zgłosić? Jak mogę zmienić to domyślne zachowanie?

Odpowiedzi

1 DavidG Dec 01 2020 at 15:55

To nie jest błąd, tak działa biblioteka. Jeśli chcesz zmienić to zachowanie, będziesz potrzebować niestandardowego konwertera typów, na przykład:

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

A teraz serializuj w ten sposób:

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

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