[英]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.