2015-01-09 66 views
1

我的服务器使用ServiceStack生成JSON,并且我需要向浏览器发送包含NaN的double[]数组。
由于JSON中没有标准的NaN编码方式,所以 ServiceStack在存在NaN (例如[0,NaN,42])的情况下产生无效的JSON并不令人惊讶。我选择字符串值作为NaN的自定义表示(顺便说一下,还有±Inf): [0,"NaN",42,"Inf","-Inf"]作为示例。 (当然,我也在浏览器端实现了必要的后期处理)。
我设法通过JsConfig<double>.RawSerializeFn设置编码器功能。 这是细,直到我意识到作为副作用double 类型的所有DTO属性从它们的JSON表示消失时该值为0。将NaN编码为JSON

编辑:这可以通过new KeyValuePair<double, double>(0, 1).ToJson() 它返回来证明{"Key":0,"Value":1}JsConfig<double>.RawSerializeFn是未设置, 但返回{"Value":1}当设置JsConfig<double>.RawSerializeFn时。
这个改变是我想避免的副作用。 (但我的核心问题是,NaN的没有牺牲零值DTO性发射。)

我浏览ServiceStack的source code ,它证实了一个自定义RawSerializeFn存在 激活Equals(DefaultValue,propertyValue)检查 (由导致propertySuppressDefaultConfig==true),这在默认情况下被省略。
AFAICS避免这种检查的唯一方法是设置JsConfig.IncludeNullValues=true, 这是不好的,因为它只能为double值不能完成。我需要 默认行为:省略具有null值(用于参考类型)的属性在生成的JSON中包含0.0个双精度值。

如何实现这些?

回答

1

custom RawSerializeFn emits 0 valuesServiceStack.Text

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} 
+0

感谢的最新版本,但是这并没有解决我的问题。对不起,如果我不够清楚。我已经更新了这个问题,请参阅编辑段落。 – robert4 2015-01-12 20:25:35

+0

@ robert4好的不用担心我刚刚为此添加了一个新的'JsConfig .IncludeDefaultValue'选项,它将生成所需的输出。这可从v4.0.36 + [现已在MyGet上提供](https://github.com/ServiceStack/ServiceStack/wiki/MyGet)获得。 – mythz 2015-01-12 20:49:52

+0

感谢您的超快反应!这个解决方案是好的。 – robert4 2015-01-12 21:41:00