JSON以相同的方式序列化两个十进制数字

本文关键字:两个 十进制数字 序列化 方式 JSON | 更新日期: 2023-09-27 18:27:23

如何强制NewtonSoft Json序列化程序以相同的方式序列化两个小数?

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位小数对它们进行序列化,从而使结果相同?

JSON以相同的方式序列化两个十进制数字

您可以按如下格式设置小数:

        var sa = JsonConvert.SerializeObject(new { value = a.ToString("#.#000") });
        var sb = JsonConvert.SerializeObject(new { value = b.ToString("#.#000") });

我在摆弄了一点串行器之后找到了一个"答案":

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

第一轮数学运算将去掉第四轮之后的任何小数。值+0.00001M完成后,100等数字变为100.00001。然后我们乘和除。所有这些都会使小数保持在4位小数。然后我们将其四舍五入,以确保我们通过+0.00001添加的第五个小数点消失。这似乎适用于我向它抛出的任何价值观。

然后使用自定义编写器:

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

我还固定了自己的答案(我忘记了一个类似的问题):将十进制序列化为JSON,如何四舍五入?