2014-05-06 13 views
7

Ich habe ein DateTimeOffset-Objekt von "05/06/2014 05:54:00 PM -04: 00".Ist es möglich, DateTimeOffset zu Zulu Zeit Zeichenfolge mit Json.NET zu serialisieren?

Beim Serialisieren mit Json.NET und ISO-Einstellung bekomme ich "2014-05-06T17: 54: 00-04: 00".

Was ich haben möchte, ist die UTC/Zulu Version dieser Zeichenfolge "2014-05-06T21: 54: 00Z".

Allerdings konnte ich keine Serializer-Einstellung finden, um dies zu erreichen. Ich weiß für DateTime-Serialisierung, ich kann DateTimeZoneHandling = DateTimeZoneHandling.Utc festlegen, um das Zulu-Format zu haben. Es gibt jedoch keine Einstellungsoption für DateTimeOffset. Fehle ich etwas? Oder muss ich eine benutzerdefinierte Überschreibung dafür erstellen?

Antwort

15

Versuchen Sie, die IsoDateTimeConverter verwenden, die mit Json.Net kommt :

var date = new DateTime(2014, 5, 6, 17, 24, 55, DateTimeKind.Local); 
var obj = new { date = new DateTimeOffset(date) }; 

JsonSerializerSettings settings = new JsonSerializerSettings(); 
settings.Converters.Add(new IsoDateTimeConverter 
{ 
    DateTimeFormat = "yyyy-MM-ddTHH:mm:ssZ", 
    DateTimeStyles = DateTimeStyles.AdjustToUniversal 
}); 

string json = JsonConvert.SerializeObject(obj, settings); 
Console.WriteLine(json); 

Ausgabe:

{"date":"2014-05-06T22:24:55Z"} 
+0

Ich vermutete, dass es einen eingebauten Weg geben muss, aber ich habe es nicht gefunden ... +1 –

+0

@ThomasLevesque Ich bin mir nicht sicher, warum Json.Net diesen Konverter nicht automatisch für 'DateTimeOffset' anwendet wie es scheint für "DateTime", aber die manuelle Anwendung scheint zu funktionieren. Wenn das nicht klappt, dann würde ich einen benutzerdefinierten Konverter schreiben, um den Job zu erledigen, den Sie in Ihrer Antwort gezeigt haben. –

+0

Sie brauchen nur die DateTimeStyles = DateTimeStyles.AdjustToUniversal, funktionierte für mich auf diese Weise, ohne das DateTimeFormat –

7

Sie können einen benutzerdefinierten Konverter wie folgt schreiben:

class UtcDateTimeOffsetConverter : Newtonsoft.Json.Converters.IsoDateTimeConverter 
{ 
    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) 
    { 
     if (value is DateTimeOffset) 
     { 
      var date = (DateTimeOffset)value; 
      value = date.UtcDateTime; 
     } 
     base.WriteJson(writer, value, serializer); 
    } 

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) 
    { 
     object value = base.ReadJson(reader, objectType, existingValue, serializer); 
     if (value is DateTimeOffset) 
     { 
      var date = (DateTimeOffset)value; 
      value = date.ToLocalTime(); 
     } 
     return value; 
    } 
} 

und wenden es auf die Eigenschaft, die Sie möchten, mit der JsonConverter Attribut:

[JsonConverter(typeof(UtcDateTimeOffsetConverter))] 
public DateTimeOffset Date { get; set; } 
+0

Danke für die sehr detaillierte Antwort. Ich denke, ich kann diesen Konverter global mit JsonConvert.DefaultSettings anwenden. Ich werde das später ausprobieren müssen. – Zoomzoom

+0

@Zoomzoom, überprüfen Brians Antwort auch, es ist einfacher –

+0

Dank Ihnen beiden. – Zoomzoom