2016-04-03 12 views
0

Newtonsoft.Jsonを使用してDataTableをJsonにシリアル化する際に問題があります。これは、還元コードです:Newtonsoft Json - DataTableのDateTime型をシリアライズ

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を追加しない場合は、同じ結果を)私が得た:これらのdatatimeの結果が違いである理由

[ 
    { 
    "Prop": "2016-04-03T16:02:09.0163201" 
    } 
] 
=========================================== 
{ 
    "Prop": "2016-04-03T16:02:09.0173201+07:00" 
} 

あなたは説明してもらえますか?

答えて

1

最初の日付の種類はUnspecifiedで、2番目の日付の種類はLocalです。最初がUnspecifiedである理由は、データテーブルの種類が弱いためです。コードをデバッグし、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種類を失うという問題があります。あなたがDataTableを使用しないでください

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); 

、理想的には:これはローカルタイムゾーンオフセットを保持しますように私はこのケースでのDateTimeOffsetを使用して、あなたをお勧めします。

関連する問題