Mencegah NewtonSoft Json menambahkan 0 trailing [duplikat]

Dec 01 2020

Saya menghadapi masalah tak terduga dengan NewtonSoft.Jsonperpustakaan. Tampaknya itu menambahkan 0 trailing ke nilai desimal yang tidak memiliki bagian desimal:

JsonConvert.SerializeObject(1m)

Akan mengembalikan string berikut: "1.0".

Meskipun ini bukan masalah dalam banyak kasus, dalam kasus saya, saya sangat peduli dengan ketepatan yang diberikan pengguna. Jika pengguna masuk 1, saya perlu menyimpan 1di database saya. Jika dia menyediakan 1.0maka saya perlu menyimpan 1.0.

Saya menggunakan versi terakhir pustaka:, 12.0.3tetapi saya mencoba dengan semua versi utama sebelumnya hingga 9.0.1, dan semuanya menghasilkan hasil yang sama.

Saya telah melihat beberapa pertanyaan tentang library yang menghapus trailing 0 (dilaporkan sebagai bug, diperbaiki di versi 11.X), tetapi tidak ada tentang menambahkan satu.

Apakah ini bug yang harus saya laporkan? Bagaimana cara mengganti perilaku default ini?

Jawaban

1 DavidG Dec 01 2020 at 15:55

Ini bukan bug, ini cara kerja perpustakaan. Jika Anda ingin menimpa perilaku ini, Anda memerlukan konverter tipe kustom, misalnya:

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

Dan sekarang buat serial seperti ini:

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

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