2015-01-09 62 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