1

NewtonSoft Json Serializer に 2 つの 10 進数を同じ方法でシリアル化させるにはどうすればよいですか?

decimal a = 1234.1200M;
decimal b = 1234.12M;

var sa = JsonConvert.SerializeObject(new { value = a });
var sb = JsonConvert.SerializeObject(new {value = b});
Console.WriteLine(sa);
Console.WriteLine(sb);

結果: {"値":1234.1200} {"値":1234.12}

結果が同じになるように、両方を4桁でシリアル化するにはどうすればよいですか?

4

2 に答える 2

0

シリアライザーを少しいじった後、「答え」を見つけました:

private class JsonTextWriterOptimized : JsonTextWriter
{
    public JsonTextWriterOptimized(TextWriter textWriter)
        : base(textWriter)
    {
    }
    public override void WriteValue(decimal value)
    {
        // we really really really want the value to be serialized as "0.0000" not "0.00" or "0.0000"!
        value = Math.Round(value, 4);
        // divide first to force the appearance of 4 decimals
        value = Math.Round((((value+0.00001M)/10000)*10000)-0.00001M, 4); 
        base.WriteValue(value);
    }
}

最初の Math.Round は、4 番目以降の小数を切り捨てます。値 +0.00001M が実行されるため、100 のような数値は 100.00001 になります。次に、掛け算と割り算です。これだけで、小数は 4 つの小数に固定されます。次に、+0.00001 で追加した 5 番目の小数がなくなるように四捨五入します。これは、私が投げたどの値でも機能するようです。

次に、カスタム ライターを使用します。

var jsonSerializer = Newtonsoft.Json.JsonSerializer.Create();
var sb = new StringBuilder(256);
var sw = new StringWriter(sb, CultureInfo.InvariantCulture);
using (var jsonWriter = new JsonTextWriterOptimized(sw))
{
    jsonWriter.Formatting = Formatting.None;
    jsonSerializer.Serialize(jsonWriter, instance);
}

私も自分の答えを修正しました(同様の質問にそれを忘れていました): 10進数をJSONにシリアル化し、四捨五入する方法は?

于 2013-08-11T23:07:29.280 に答える