Newtonsoft Json - 序列化DataTable的{Date}类型

时间:2016-04-03 09:12:09

标签: c# .net json datetime datatable

使用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"
}

你能解释为什么这些数据时间结果不同吗?

1 个答案:

答案 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