Zapobiegaj dodawaniu przez NewtonSoft Json końcowego 0 [duplikat]
Mam niespodziewany problem z NewtonSoft.Json
biblioteką. 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ć 1
w mojej bazie danych. Jeśli on zapewnia 1.0
, muszę przechowywać 1.0
.
Używam ostatniej wersji biblioteki: 12.0.3
ale próbowałem z wszystkimi poprzednimi wersjami głównymi aż do 9.0.1
i 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
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);