2016-05-19 15 views
2

Ich habe einen REST-Endpunkt mit ASP.NET Web API 2 geschrieben, der Daten empfängt. Das Backend-System hat kein Konzept von UTC-Zeiten oder DST, die in der Datenbank gespeicherten Daten sind nur das britische Datum und die Zeit.Ignoriere UTC-Offsets beim Deserialisieren mit Json.NET

Die Website, die den Endpunkt einspeist, enthält jedoch UTC-Offsetwerte in den Daten, die an den Endpunkt gesendet werden (z. B. ein Datum wie "1939-01-08T00: 00: 00 + 01: 00"). Dies passiert, wenn ein Sommerdatum im Winter eingegeben wird oder umgekehrt (wegen der Anpassung für Sommerzeit).

Kann ich den JSON-Deserializer so einstellen, dass er diese UTC-Offset-Werte vollständig ignoriert? Ich habe mir die Dokumente und die Beispiele here angeschaut und alle verschiedenen Enum-Optionen ausprobiert, aber keine von ihnen gibt mir das Verhalten, nach dem ich suche.

Antwort

0

Wenn die Datumsanalyse nicht wie gewünscht funktioniert, können Sie sie deaktivieren und stattdessen einen benutzerdefinierten JsonConverter verwenden, um die Daten zu verarbeiten.

Hier ist ein Konverter, der die Arbeit machen soll:

var config = GlobalConfiguration.Configuration; 
var jsonSettings = config.Formatters.JsonFormatter.SerializerSettings; 
jsonSettings.DateParseHandling = DateParseHandling.None; 
jsonSettings.Converters.Add(new OffsetIgnoringDateConverter()); 

hier:

class OffsetIgnoringDateConverter : JsonConverter 
{ 
    public override bool CanConvert(Type objectType) 
    { 
     return (objectType == typeof(DateTime) || objectType == typeof(DateTime?)); 
    } 

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) 
    { 
     string rawDate = (string)reader.Value; 
     if (rawDate == null) return existingValue; 
     if (rawDate.Length > 19) rawDate = rawDate.Substring(0, 19); 
     DateTime date = DateTime.ParseExact(rawDate, "yyyy'-'MM'-'dd'T'HH':'mm':'ss", 
           CultureInfo.CurrentCulture, DateTimeStyles.AssumeLocal); 
     return date; 
    } 

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

    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) 
    { 
     throw new NotImplementedException(); 
    } 
} 

diesen Konverter in die Web-API-Pipeline zu installieren, in Global.asax folgendes zu Ihrer Application_Start() Methode hinzufügen eine Demo (Konsolen-App): https://dotnetfiddle.net/kt9pFl

Verwandte Themen