NewtonSoftJsonが末尾の0を追加しないようにします[重複]

Dec 01 2020

NewtonSoft.Jsonライブラリで予期しない問題が発生しています。小数部を持たない小数値に末尾の0を追加するようです。

JsonConvert.SerializeObject(1m)

次の文字列を返します:"1.0"

多くの場合問題にはなりませんが、私の場合は、ユーザーが提供する精度に関心があります。ユーザーが入力した場合、データベース1に保存する必要があり1ます。彼が提供する場合1.0、私は保存する必要があり1.0ます。

ライブラリの最後のバージョンを使用しています:12.0.3、しかし、以前のすべてのメジャーバージョンをまで試してみたところ、すべて9.0.1同じ結果が得られました。

ライブラリが末尾の0を削除することについていくつかの質問を見ました(バグとして報告され、バージョン11.Xで修正されました)が、1を追加することについては何もありません。

これは私が報告すべきバグですか?このデフォルトの動作をオーバーライドするにはどうすればよいですか?

回答

1 DavidG Dec 01 2020 at 15:55

これはバグではなく、ライブラリの動作方法です。この動作をオーバーライドする場合は、次のようなカスタム型コンバーターが必要になります。

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

そして今、このようにシリアル化します:

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

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