【问题标题】:Newtonsoft Json - Serialize DateTime type of DataTableNewtonsoft Json - 序列化 DataTable 的 DateTime 类型
【发布时间】:2016-07-22 20:52:17
【问题描述】:

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

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

【问题讨论】:

    标签: c# .net json datetime datatable


    【解决方案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);
    

    话虽如此,您仍然会遇到使用 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

    【讨论】:

      猜你喜欢
      • 2012-05-18
      • 1970-01-01
      • 2016-09-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-06
      相关资源
      最近更新 更多