【问题标题】:Removing NaN values in deserialization Web API 2 C#在反序列化 Web API 2 C# 中删除 NaN 值
【发布时间】:2017-03-08 21:37:22
【问题描述】:

您好,我想知道是否有人可以帮助我,我正在尝试在 Web API 2 中自动反序列化时自动将双值中的 NaN 替换为 0。我正在尝试使用 JSON.NET,但没有成功。任何帮助将不胜感激。我将以下内容放入我的 WebApiConfig

config.Formatters.JsonFormatter.SupportedMediaTypes.Add(new MediaTypeHeaderValue("text/html"));

MediaTypeHeaderValue appXmlType = config.Formatters.XmlFormatter.SupportedMediaTypes.FirstOrDefault(t => t.MediaType == "application/xml");
config.Formatters.XmlFormatter.SupportedMediaTypes.Remove(appXmlType);

JsonMediaTypeFormatter jsonFormatter = GlobalConfiguration.Configuration.Formatters.JsonFormatter;
jsonFormatter.SerializerSettings.FloatFormatHandling = Newtonsoft.Json.FloatFormatHandling.DefaultValue;
jsonFormatter.SerializerSettings.MissingMemberHandling = MissingMemberHandling.Ignore;
jsonFormatter.SerializerSettings.Formatting = Newtonsoft.Json.Formatting.None;
jsonFormatter.SerializerSettings.DateFormatHandling = DateFormatHandling.IsoDateFormat;
jsonFormatter.SerializerSettings.FloatParseHandling =  FloatParseHandling.Double;
jsonFormatter.SerializerSettings.DefaultValueHandling =  DefaultValueHandling.Populate;

NaN 值不会被删除并被放入类中的

public double Price { get; set; }

所以在一个数字里面我得到了 NaN。

【问题讨论】:

标签: c# .net json.net asp.net-web-api2


【解决方案1】:

我最终想出了如何解决读写问题。

jsonFormatter.SerializerSettings.Converters.Add(new FloatConverter());

public class FloatConverter : JsonConverter
{
    public override bool CanRead
    {
        get
        {
            return true;
        }
    }

    public override bool CanWrite
    {
        get
        {
            return true;
        }
    }

    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
    {
        if (value == null)
        {
            writer.WriteNull();
            return;
        }

        var val = Convert.ToDouble(value);
        if (Double.IsNaN(val) || Double.IsInfinity(val))
        {
            writer.WriteNull();
            return;
        }
        if (value is float)
            writer.WriteValue((float)value);
        else
            writer.WriteValue((double)value);
    }

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        if (reader.TokenType == JsonToken.Null)
            return null;

        var value = JValue.Load(reader);
        var val = Convert.ToDouble(value);

        if (objectType == typeof(Double))
        {
            if (Double.IsNaN(val) || Double.IsInfinity(val))
                return (Double)0.00;
            else
                return (Double)value;
        }

        if (objectType == typeof(float?))
            return (float?)value;
        else
            return (float)value;
    }

    public override bool CanConvert(Type objectType)
    {
        return objectType == typeof(double) || objectType == typeof(float);
    }
}

【讨论】:

  • JsonConverter 是 Newtonsoft 的一部分吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-17
  • 1970-01-01
相关资源
最近更新 更多