.net - 将NaN值序列化为JSON.NET中的空值作为JSON

标签 .net json serialization json.net nan

大多数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输入转换为空输出?

最佳答案

作者advises us“如果这对您很重要,请为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);

关于.net - 将NaN值序列化为JSON.NET中的空值作为JSON,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7814247/

相关文章:

.net - 任何人都可以向我解释 System.Xml.XmlDictionaryWriter.WriteNode(XmlReader, bool) 方法的 bool 参数的含义是什么?

c# - 如何使用范围数据注释属性指定最小但没有最大小数?

C# 把钱的小数变成整数

json - 如何发送不同值的Json?

javascript - Firefox 14.0.1 在读取通过 AJAX 发送的 JSON 文件时返回错误

php - 将 4 字节大整数写为无符号二进制

c# - 将不可序列化的类转换为字节数组

c# - 扩展 .NET 类型系统,以便编译器在某些情况下强制执行原始值的语义

javascript - json解析空响应时Whatwg Fetch失败,我该如何防止它?

wcf - 使用 DataContractSerializer 序列化 DataSet 时保留 DataRowState