C# JSON以相同的方式序列化两个十进制数
如何强制NewtonSoft Json序列化程序以相同的方式序列化两个小数C# JSON以相同的方式序列化两个十进制数,c#,serialization,formatting,json.net,C#,Serialization,Formatting,Json.net,如何强制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); 结果如下:
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个小数对它们进行序列化,使结果相同?您可以按如下格式设置小数:
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);
}
我还修正了我自己的答案(我把它忘在了一个类似的问题上):
有点麻烦,删除
M
之前的尾随零。很高兴在这里看到你+1,但这是一个字符串,不是小数点。您的结果将是{“value”:“1234.1200”}
。此外,如果小数是更复杂对象的一部分,而不仅仅是我在示例中使用的一个简单版本,则这不起作用。如果您想将其视为小数,“1234.1200”和“1234.12”之间没有任何区别。您需要的是字符串表示形式的差异。有人可能会说,你要求它像十进制一样走,像字符串一样嘎嘎。。。