使用Newtonsoft.Json
将DataTable序列化为Json时出现问题。这是还原代码:
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"
}
你能解释为什么这些数据时间结果不同吗?
答案 0 :(得分:2)
第一个日期种类为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);
据说你仍然有使用DataTable丢失DateTime类的问题。在这种情况下,我建议您使用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
。