2016-04-03 16 views
0

Newtonsoft.Json'u kullanarak DataTable'ı Json'a serileştirirken bir sorunum var. Bu indirgeyici kodudur:Newtonsoft Json - Serialize DateTime türü DataTable

using System; 
using System.Data; 
using Newtonsoft.Json; 
using Newtonsoft.Json.Converters; 
class Program 
{ 
    static void Main(string[] args) 
    { 
     DataTable dt = new DataTable(); 
     dt.Columns.Add("Prop", typeof(DateTime)); 
     dt.Rows.Add(DateTime.Now); 

     ObjCls cls = new ObjCls(); 
     cls.Prop = DateTime.Now; 

     JsonSerializerSettings settings = new JsonSerializerSettings(); 
     settings.Converters.Add(new IsoDateTimeConverter()); 

     string json1 = JsonConvert.SerializeObject(dt, Formatting.Indented, settings); 
     string json2 = JsonConvert.SerializeObject(cls, Formatting.Indented, settings); 

     Console.WriteLine(json1); 
     Console.WriteLine("==========================================="); 
     Console.WriteLine(json2); 
    } 

    class ObjCls 
    { 
     public DateTime Prop { get; set; } 
    } 
} 

Ve (Ben IsoDateTimeConverter katmayan eğer aynı sonucu) I got: Bu DataTime sonuçları fark neden

[ 
    { 
    "Prop": "2016-04-03T16:02:09.0163201" 
    } 
] 
=========================================== 
{ 
    "Prop": "2016-04-03T16:02:09.0173201+07:00" 
} 

açıklayabilir misiniz?

cevap

1

İlk tarih türü Unspecified iken, ikincisi Local'dur. İlkinin Unspecified olması nedeni, bir DataTable'ın zayıf yazılan niteliğinden kaynaklanmaktadır. Kodunuzu ayıklar ve gerçek tarih değerine ulaşana kadar DataTable'ın Satırlar koleksiyonunu genişletirseniz, bunun Unspecified olduğunu fark edeceksiniz. Hep ISO 8601 yılında seri hale getirmek istiyorsanız UTC aşağıdaki ayarları kullanabilirsiniz: Bu söyleniyor

JsonSerializerSettings settings = new JsonSerializerSettings(); 
settings.DateTimeZoneHandling = DateTimeZoneHandling.Utc; 
settings.DateFormatHandling = DateFormatHandling.IsoDateFormat; 

string json1 = JsonConvert.SerializeObject(dt, Formatting.Indented, settings); 
string json2 = JsonConvert.SerializeObject(cls, Formatting.Indented, settings); 

yine DataTable ile DateTime tür kaybetme sorun var. Bu ofset yerel saat dilimini koruyacak gibi ben bu durumda bir DateTimeOffset kullanarak tavsiye ederim:

DataTable dt = new DataTable(); 
dt.Columns.Add("Prop", typeof(DateTimeOffset)); 
dt.Rows.Add(DateTimeOffset.Now); 

ObjCls cls = new ObjCls(); 
cls.Prop = DateTimeOffset.Now; 

object o = DateTime.Now; 
JsonSerializerSettings settings = new JsonSerializerSettings(); 

string json1 = JsonConvert.SerializeObject(dt, Formatting.Indented, settings); 
string json2 = JsonConvert.SerializeObject(cls, Formatting.Indented, settings); 

ve idealinize DataTable kullanmak asla.