シリアライザーを少しいじった後、「答え」を見つけました:
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にシリアル化し、四捨五入する方法は?