2016-04-03 55 views
0

使用Newtonsoft.Json将DataTable序列化为Json时出现问题。这是还原代码:Newtonsoft Json - Serialize DateTime类型的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; } 
    } 
} 

而且我得到了(同样的结果,如果我不加IsoDateTimeConverter):

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

你能解释为什么这些DATATIME结果不同?

回答

1

第一种日期种类是Unspecified而第二种是Local。之所以首先是Unspecified是因为DataTable的弱类型性质。如果您调试代码并展开DataTable的Rows集合,直到达到实际日期值,您将注意到它是Unspecified。如果你想始终处于ISO 8601 UTC序列化,你可以使用以下设置:

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

这是说你仍然有失去的DateTime类和DataTable的问题。我建议你在这种情况下使用的DateTimeOffset,因为这会保护当地的时区偏移:

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

理想情况下,你不应该使用DataTable