2013-05-01 4 views
21

Gibt es eine einfache Art und Weise JSON.NET so zu konfigurieren, dass einigeDateTime Felder werden ohne Zeit und andere DateTime Felder werden immer noch mit der Zeit formatiert werden formatiert werden?Daten ohne Zeit in ASP.NET Web API JSON Ausgabe

Beispiel:

{ firstName: 'John', lastName : 'Doe', birthday: '1965-09-23' } 

Antwort

38

Wenn Sie dies nur ein bestimmtes Feld beeinflussen müssen, einen Konverter Typ erstellen zuerst:

public class OnlyDateConverter : IsoDateTimeConverter 
{ 
    public OnlyDateConverter() 
    { 
     DateTimeFormat = "yyyy-MM-dd"; 
    } 
} 

und fügen Sie dann dieses Attribut zu den Feldern/Eigenschaften hinzu, für die Sie dies wünschen:

[JsonConverter(typeof(OnlyDateConverter))] 
+0

Schön. Ich habe gerade das gleiche geschrieben, aber "DateTimeConverterBase" erweitert. Das ist viel sauberer! –

+0

Genau das, was ich brauchte! Vielen Dank Youssef! – RooSoft

+0

Anscheinend sollten Sie '/' anstelle von Bindestrichen für bestimmte alte Browser verwenden: http://blog.dygraphs.com/2012/03/javascript-and-dates-what-mess.html –

4

Versuchen Sie diese Zeile hinzufügen Ihre Web-API zu konfigurieren:

config.Formatters.JsonFormatter.SerializerSettings.Converters.Add(
    new IsoDateTimeConverter() { DateTimeFormat = "yyyy-MM-dd" }); 
+5

Das hätte Auswirkungen global, nicht nur auf "einige" Felder, wie gewünscht. –

0

Die Antwort von Yousesef mit der OnlyDateConverter ist am besten. Aber hier ist eine Alternative:

private DateTime _birthday; 
public string Birthday 
{ 
    get { return _birthday.ToString("yyyy-MM-dd"); } 
    set { 
      _birthday = DateTime.ParseExact(value, "yyyy-MM-dd", 
              CultureInfo.InvariantCulture); 
     } 
} 

Vorteil - Sie brauchen nicht die Newtonsoft.Json Bibliothek auf Ihre Klassen zu binden.

Nachteil - Die Eigenschaft wird jetzt als Zeichenfolge überall dort angezeigt, wo Sie sie verwenden, was zu eigenen Problemen führen kann.

+0

Ich habe diesen Ansatz berücksichtigt, aber es ist möglicherweise nicht der beste, wenn Berechnungen zwischen Daten beteiligt sein könnten. Trotzdem danke! – RooSoft

+0

@RooSoft - vereinbart. –