2016-10-26 8 views
4

Ich mag DateTime Felder, die DateTime.MinValue zurück von meinem Web-API festgelegt werden anstelle von "0001-01-01T00:00:00"-NULL serialisiert werden.JSON.NET Serialize DateTime.MinValue als null

Ich verstehe, dass es eine Möglichkeit gibt, JSON.NET Felder auslassen, die auf Standardwerte festgelegt sind, aber ich möchte JSON.NET speziell serialisieren DateTime MinValue/"0001-01-01T00:00:00" as null.

Gibt es eine Möglichkeit, dies zu tun?

+0

Sie in Immobilien-Objekt selber festlegen können. wenn es DateTime.MinValue ist. Denken Sie daran, Ihre DateTime sollte nullbar sein. –

+0

Es ist wahrscheinlich ein Fehler, aber wir haben ein Code-Generierungssystem, das Entity-Code für NOT NULL DateTime-Spalten als 'DateTime' generiert. Wenn die Spalte Nullable ist, ist der .NET-Typ "DateTime?". Ich denke nicht, dass ich das ändern könnte, ohne viel Code zu brechen – Mick

+0

Aber ohne NULL-fähig zu machen, können Sie DateTime keinen NULL-Wert zuweisen –

Antwort

6

Erstellen Sie einen benutzerdefinierten Konverter, die DateTime.MinValue in null serialisiert und (falls erforderlich) deserialisiert null in DateTime.MinValue:

public class MinDateTimeConverter : DateTimeConverterBase 
{ 
    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) 
    { 
     if (reader.Value == null) 
      return DateTime.MinValue; 

     return (DateTime)reader.Value; 
    } 

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

     writer.WriteValue(value); 
    } 
} 

Sie können dann als Attribut den Konverter, um Ihre Daten Klasse hinzuzufügen, in diesem Beispiel gezeigt :

public class Example 
{ 
    [JsonConverter(typeof(MinDateTimeConverter))] 
    public DateTime ValueOne { get; set; } 

    [JsonConverter(typeof(MinDateTimeConverter))] 
    public DateTime ValueTwo { get; set; } 
} 

public static void Main(string[] args) 
{ 
    Example data = new Example(); 
    data.ValueOne = DateTime.MinValue; 
    data.ValueTwo = DateTime.Now; 

    JsonSerializer serializer = new JsonSerializer(); 

    using (StringWriter writer = new StringWriter()) 
    { 
     serializer.Serialize(writer, data); 
     Console.Write(writer.ToString()); 
    } 

    Console.ReadKey(); 
} 

Console Ausgang:

{"ValueOne":null,"ValueTwo":"2016-10-26T09:54:48.497463+01:00"} 
+0

['DateTimeConverterBase'] (https: //github.com/JamesNK/Newtonsoft.Json/blob/master/Src/Newtonsoft.Json/Converters/DateTimeConverterBase.cs) akzeptiert auch 'DateTimeOffset', so dass Sie 'CanConvert' so modifizieren müssen, dass nur für' DateTime' und 'DateTime?' – dbc

+0

@dbc Dieser Konverter funktioniert nur, wenn er direkt auf 'DateTime'-Eigenschaften angewendet wird, die ein 'JsonConverter'-Attribut verwenden. 'CanConvert' wird in diesem Szenario nicht aufgerufen. 'ReadJson' müsste geändert werden, wenn' DateTime? '-Typen unterstützt werden müssen. –

4

Benutzerdefinierte Datetime Json Converter

public class DateTimeConverter : JsonConverter 
{ 
    public override void WriteJson(JsonWriter jsonWriter, object inputObject,JsonSerializer jsonSerializer) 
    { 
     // Typecast the input object 
     var dateTimeObject = inputObject as DateTime?; 

     // Set the properties of the Json Writer 
     jsonWriter.Formatting = Newtonsoft.Json.Formatting.Indented; 

     if(dateTimeObject == DateTime.MinValue) 
      jsonWriter.WriteValue((DateTime?)null); 
     else 
      jsonWriter.WriteValue(dateTimeObject); 
    } 


    public override object ReadJson(JsonReader reader, 
     Type objectType, 
     object existingValue, 
     JsonSerializer serializer) 
    { 
     DateTime? readValue = reader.ReadAsDateTime(); 

     return (readValue == null) ? DateTime.MinValue : readValue;  

    } 


    public override bool CanConvert(Type objectType) 
    { 
     return typeof(DateTime?).IsAssignableFrom(objectType); 
    } 
} 

Verbrauch:

public class DateTest 
{ 
    [JsonConverterAttribute(typeof(DateTimeConverter))] 
    public DateTime? MyDateTime { get; set;} 

    [JsonConverterAttribute(typeof(DateTimeConverter))] 
    public DateTime? MyDateTime1 { get; set; } 
} 

void Main() 
{ 
    DateTest dateTest = new DateTest 
    { 
     MyDateTime = DateTime.MinValue, 
     MyDateTime1 = DateTime.MaxValue 
    }; 

    Console.WriteLine(JsonConvert.SerializeObject(dateTest)); 
} 

Ergebnis:

{ 
    "MyDateTime": null, 
    "MyDateTime1": "9999-12-31T23:59:59.9999999" 
} 
Verwandte Themen