servicestack,Json,servicestack" /> servicestack,Json,servicestack" />

将NaN编码为JSON

将NaN编码为JSON,json,servicestack,Json,servicestack,我的服务器使用ServiceStack生成JSON,我需要向浏览器发送包含NAN的double[]数组。 由于JSON中没有编码NAN的标准方法,因此毫不奇怪 ServiceStack在存在NAN时生成无效JSON (例如[0,NaN,42])。我选择字符串值作为NAN的自定义表示形式(顺便说一句,±Inf): [0,“NaN”,42,“Inf”,“-Inf”]作为示例。(当然,我也在浏览器端实现了必要的后处理)。 通过将JsConfig.RawSerializeFn设置为编码器函数,我成功地做

我的服务器使用ServiceStack生成JSON,我需要向浏览器发送包含NAN的
double[]
数组。
由于JSON中没有编码NAN的标准方法,因此毫不奇怪 ServiceStack在存在NAN时生成无效JSON (例如
[0,NaN,42]
)。我选择字符串值作为NAN的自定义表示形式(顺便说一句,±Inf):
[0,“NaN”,42,“Inf”,“-Inf”]
作为示例。(当然,我也在浏览器端实现了必要的后处理)。
通过将
JsConfig.RawSerializeFn
设置为编码器函数,我成功地做到了这一点。 这很好,直到我意识到所有类型为
double
DTO属性的副作用 当值为0时,从JSON表示中消失

编辑:这可以通过
newkeyvaluepair(0,1).ToJson()来演示
当
JsConfig.RawSerializeFn
未设置时,返回
{“Key”:0,“Value”:1}
, 但是当设置了
JsConfig.fn
时,返回
{“Value”:1}

这种改变是我想要避免的副作用。(但我的核心问题是在不牺牲零值DTO属性的情况下传输NAN。)

我浏览了报纸 它确认了ServiceStack的存在 自定义的
RawSerializeFn
激活
Equals(DefaultValue,propertyValue)
检查 (通过导致
propertySuppressDefaultConfig==true
),默认情况下会忽略该属性。
AFAICS避免此检查的唯一方法是设置
JsConfig.IncludeNullValues=true
, 这是不好的,因为它不能仅对
值执行。我需要 默认行为:省略具有
null
值的属性(对于引用类型),并在生成的JSON中包含0.0双精度值

如何实现这些功能?

最新版本的

JsConfig.IncludeDefaultValue=true;
JsConfig.fn=d=>
double.IsPositiveInfinity(d)?
“\“+Inf”
:双精度。是否为负精度(d)?
“\”-Inf\”
:双人。伊斯南(d)?
““南”
:d.ToString();
var doubles=new[]{
0.0,1.0,double.NegativeInfinity,double.NaN,double.PositiveInfinity};
doubles.ToJson().Print();//[0,1,“-Inf”,“NaN”,“+Inf”]
新的KeyValuePair(0,1).ToJson().Print();//{“键”:0,“值”:1}

谢谢,但这并不能解决我的问题。对不起,如果我不够清楚的话。我已经更新了问题,请查看编辑段落。@robert4好的,不用担心,我刚刚为此添加了一个新的
JsConfig.IncludeDefaultValue
选项,该选项将生成所需的输出。这可从v4.0.36+获得。谢谢您的快速响应!这个解决方案是可以的。
JsConfig<double>.IncludeDefaultValue = true;
JsConfig<double>.RawSerializeFn = d =>
    double.IsPositiveInfinity(d) ?
        "\"+Inf\""
    : double.IsNegativeInfinity(d) ?
        "\"-Inf\""
    : double.IsNaN(d) ?
        "\"NaN\""
    : d.ToString();

var doubles = new[] { 
    0.0, 1.0, double.NegativeInfinity, double.NaN, double.PositiveInfinity };

doubles.ToJson().Print(); // [0,1,"-Inf","NaN","+Inf"]

new KeyValuePair<double, double>(0, 1).ToJson().Print(); // {"Key":0,"Value":1}