一尘不染

Json.NET以最小的小数位序列化float / double,即没有多余的“ .0”吗?

json

当序列化浮点数和双精度数时,如果数字不包含任何小数部分,Json.NET总是在末尾添加“
.0”。我想知道是否有一种简单的方法可以绕过此方法,从而获得更紧凑的表示形式?序列化包含许多数字的对象时,多余的句点和零加起来。

例如,运行此代码时:

JsonConvert.SerializeObject(1.0);

我期望(并想要)这个结果:

"1"

但是我得到了:

"1.0"

我查看了源代码,发现它是在提交0319263中故意添加的(
“ …- Fixed JsonConvert总是写一个带小数点的浮点数…” ),它运行的代码基本上类似于:

    private static string EnsureDecimalPlace(double value, string text)
    {
        if (double.IsNaN(value) || double.IsInfinity(value) ||
            text.IndexOf('.') != -1 || text.IndexOf('E') != -1 ||
            text.IndexOf('e') != -1)
        {
            return text;
        }

        return text + ".0";
    }

因此,我想知道:

  1. 发生这种变化的原因可能是什么?的JSON规范似乎并不需要它。

  2. 有没有简单的方法可以绕过它?


阅读 479

收藏
2020-07-27

共1个答案

一尘不染

1.发生这种变化的原因可能是什么?

规范不要求它,但也不禁止它。

我的猜测是,它允许对Json.NET进行更好的类型检查(如果它们在某处),或者这是“以防万一”的事情,它可以区分整数和浮点类型。

来自Json.org

2.有没有简单的方法可以绕过它?

并不是那么容易,但是如果您真的想要的话,可以将其更改EnsureDecimalPlace()为简单地重新编译自己的Json.NET版本。return text;

2020-07-27