2016-06-25 11 views
2

jsonに含まれるタイムスタンプをオブジェクトに逆シリアル化すると、失われるオブジェクトはミリ秒精度になります。JSON.netを使用してオブジェクトにデシリアライズするときのタイムスタンプからのミリ秒を失う

var json = "{\"timestamp\":\"2016-06-16T16:27:36.808Z\"}"; 
var dict = JsonConvert.DeserializeObject<Dictionary<string, object>>(json); 
Console.WriteLine(dict["timestamp"]); 

出力:

16/06/2016 16:27:36 

これは私が日時にオブジェクトを変換する場合にも発生します。

var obj = dict["timestamp"]; 
var timestamp = DateTime.Parse(obj.ToString()); 
Console.WriteLine(timestamp.ToString("yyyy/MM/dd HH:mm:ss.ffff")); 

出力:

2016/06/16 16:27:36.0000 
+0

DateTimeをシリアル化する際にJSON.NETにミリ秒を含めることができる(msコンポーネントがゼロの場合でも)](http://stackoverflow.com/questions/18193281/force-json-net-to-include-milliseconds -when-serializing-datetime-if-ms-com) –

答えて

2

あなたはJsonSerializerSettingsを変更し、 'なし' にDateParseHandlingを設定する必要があります。

var json = "{\"timestamp\":\"2016-06-16T16:27:36.808Z\"}"; 
var jsonSerializerSettings = new JsonSerializerSettings { DateParseHandling = DateParseHandling.None }; 
var dict = JsonConvert.DeserializeObject<Dictionary<string, object>>(json, jsonSerializerSettings); 
var obj = dict["timestamp"]; 
Console.WriteLine(obj); 

出力:

2016/06/16 17:27:36.8080 
4

問題は、両方のケースでDateTimeの上のToStringメソッドを呼び出していると、デフォルトの文字列表現は、ミリ秒を含んでいないので、それらが失われることに過ぎません。最初のスニペットの最後の行を変更する

var json = "{\"timestamp\":\"2016-06-16T16:27:36.808Z\"}"; 
var dict = JsonConvert.DeserializeObject<Dictionary<string, object>>(json); 
Console.WriteLine(((DateTime)dict["timestamp"]).ToString("O")); 

2016-06-16T16を与える:27:36.8080000Z

"O" はラウンドです完全精度を含むトリップ形式。別の形式を使用することもできます。

関連する問題