2014-05-06 18 views
7

"05/06/2014 05:54:00 PM -04: 00" için bir DateTimeOffset nesnesine sahibim.DateTimeOffset'i zulu zaman dizisine Json.NET ile serileştirmek mümkün mü?

Json.NET ve ISO ayarlarını kullanarak serileştirirken, "2014-05-06T17: 54: 00-04: 00" olsun.

Sahip olmak istediğim, "2014-05-06T21: 54: 00Z" dizesinin UTC/Zulu sürümüdür. Bununla birlikte, bunu başarmak için herhangi bir serializer ayarı bulamadım. DateTime serileştirme için biliyorum, Zulu formatı için DateTimeZoneHandling = DateTimeZoneHandling.Utc'yi ayarlayabilirim. Ancak, DateTimeOffset için böyle bir ayar seçeneği yoktur. Bir şey mi eksik? Ya da bunun için özel bir geçersiz kılma yapmak zorunda mıyım?

cevap

15

Json.Net ile gelir IsoDateTimeConverter kullanmayı deneyin :

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

Çıktı:

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

Bunu yapmak için yerleşik bir yol olması gerektiğinden şüpheleniliyordum ama bulamadım ... +1 –

+0

@ThomasLevesque Json.Net bu dönüştürücüyü neden otomatik olarak "DateTimeOffset" için kullanmıyor? 'DateTime' için olduğu gibi görünüyor, ancak elle uygulamak gibi görünüyor. Başarısızlık, o zaman evet, cevabınızda gördüğünüz gibi işi yapmak için özel bir dönüştürücü yazarım. –

+0

yalnızca DateTimeStyles = DateTimeStyles.AdjustToUniversal'a ihtiyacınız var, DateTimeFormat –

7

Böyle özel bir dönüştürücü yazabilirsiniz:

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

Ve JsonConverter özelliğini kullanarak istediğiniz mülkiyet uygulayın:

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

Çok ayrıntılı yanıt için teşekkürler. Bu dönüştürücüyü JsonConvert.DefaultSettings kullanarak global olarak uygulayabileceğimi düşünüyorum. Bunu daha sonra denemek zorundayım. – Zoomzoom

+0

@Zoomzoom, Brian'ın cevabını da kontrol edin, daha basit –

+0

İkinize de teşekkürler. – Zoomzoom