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

时间:2013-08-11 04:49:44

标签: c# serialization formatting json.net

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

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位小数,以便结果相同?

2 个答案:

答案 0 :(得分:0)

您可以按如下方式格式化小数:

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

答案 1 :(得分: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添加的第五个小数消失了。 这似乎适用于我投入的任何价值观。

然后使用自定义编写器:

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

我也修正了自己的答案(我忘记了这个问题): Serializing a decimal to JSON, how to round off?