将NaN编码为JSON
我的服务器使用ServiceStack生成JSON,我需要向浏览器发送包含NAN的将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设置为编码器函数,我成功地做
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}