簡體   English   中英

Newtonsoft Json-序列化DataTable的DateTime類型

[英]Newtonsoft Json - Serialize DateTime type of 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"
}

您能解釋為什么這些數據時間結果不同嗎?

第一個日期類型是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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM