2017-03-08 25 views
2

你好,我想知道如果有人可以幫助我,我想自動雙值自動0時在網頁API 2.我想使用JSON自動反序列化替換爲NaN。 NET,但我沒有成功。任何幫助將不勝感激。我把下面的到我WebApiConfig刪除NaN值在反序列化的Web API 2 C#

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的內部。

+0

相關:http://stackoverflow.com/questions/7814247/serialize-nan-values-into-json-as-nulls-in-json-net – stuartd

回答

0

我終於想通了,如何解決讀取和寫入的問題。

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