Dot-Net
在 JSON.NET 中將 NaN 值序列化為 JSON 作為空值
大多數 Json 解析器不會序列化 NaN,因為在 Javascript 中,NaN 不是常量。然而,Json.Net 確實將 NaN 值序列化為 NaN,這意味著它輸出無效的 Json;大多數解析器嘗試反序列化此 Json 將失敗。(我們在 WebKit 中反序列化。)
我們已經破解了 Json.Net 程式碼以在傳遞 NaN 時輸出空值,但這似乎是一個糟糕的解決方案。Douglas Crockford(曾經)建議使用空值代替 NaN:
http://www.json.org/json.ppt (看幻燈片 16)
顯然,這並非在所有情況下都有效,但對於我們的目的來說是可以的。我們寧願不必修改 Json.Net 的原始碼。有誰知道如何使用 Json.Net 將 NaN 輸入轉換為空輸出?
作者建議我們“如果這對您很重要,請為 float/double 編寫一個 JsonConverter 以使 NaN 安全”,因此您可以這樣做:
class LawAbidingFloatConverter : JsonConverter { public override bool CanRead { get { return false; } } public override bool CanWrite { get { return true; } } public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) { var val = value as double? ?? (double?) (value as float?); if (val == null || Double.IsNaN((double)val) || Double.IsInfinity((double)val)) { writer.WriteNull(); return; } writer.WriteValue((double)val); } public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) { throw new NotImplementedException(); } public override bool CanConvert(Type objectType) { return objectType == typeof(double) || objectType == typeof(float); } }然後使用它:
var settings = new JsonSerializerSettings(); var floatConverter = new LawAbidingFloatConverter(); settings.Converters.Add(floatConverter); var myConverter = new JsonNetSerializer(settings);