Dot-Net

在 JSON.NET 中將 NaN 值序列化為 JSON 作為空值

  • November 23, 2016

大多數 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);

引用自:https://stackoverflow.com/questions/7814247