将NaN值序列化为JSON.NET中的空值作为JSON [英] Serialize NaN values into JSON as nulls in JSON.NET

查看:248
本文介绍了将NaN值序列化为JSON.NET中的空值作为JSON的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

大多数Json解析器不会序列化NaN,因为在Javascript中,NaN不是常数.但是,Json.Net确实将NaN值序列化为NaN,这意味着它输出了无效的Json.尝试反序列化此Json将对大多数解析器失败. (我们正在WebKit中反序列化.)

Most Json parsers don't serialize NaN, because in Javascript, NaN is not a constant. Json.Net, however, does serialize NaN values into NaN, which means it outputs invalid Json; attempting to deserialize this Json will fail with most parsers. (We're deserializing in WebKit.)

我们已经破解了Json.Net代码,以在通过NaN时输出空值,但这似乎是一个糟糕的解决方案.道格拉斯·克罗克福德(Douglas Crockford)(一次)建议使用空值代替NaN:

We have hacked the Json.Net code to output null values when passed NaN, but this seems like a poor solution. Douglas Crockford (once) recommended using nulls in place of NaNs:

http://www.json.org/json.ppt (请看幻灯片16 )

http://www.json.org/json.ppt (Look at slide 16)

显然,这并非在所有情况下都有效,但对于我们的目的而言,这是可以的.我们宁愿不必修改Json.Net的源代码.有谁知道如何使用Json.Net将NaN输入转换为空输出?

Clearly this won't work in all cases, but it would be ok for our purposes. We'd just rather not have to modify the source code of Json.Net. Does anyone know how to use Json.Net to convert NaN inputs into null outputs?

推荐答案

作者为我们提供了建议如果这对您很重要,请为Float/double写一个JsonConverter以使NaN安全",这就是您可以做的:

The author advises us to "Write a JsonConverter for float/double to make NaN safe if this is important for you," so that’s what you can do:

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);

这篇关于将NaN值序列化为JSON.NET中的空值作为JSON的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆