2016-11-20 25 views
1

當我使用下面的代碼:newtonsoft jobject.Value <DateTime>()將無法工作

string jsonStr = JsonConvert.SerializeObject(new 
{ 
    savedAtGMT0 = DateTime.UtcNow.ToString() 
}); 
MessageBox.Show(jsonStr); 
JObject jsonObj = JObject.Parse(jsonStr); 
MessageBox.Show(jsonObj["savedAtGMT0"].Value<string>()); 
MessageBox.Show(DateTime.Parse(jsonObj["savedAtGMT0"].Value<string>()).ToString()); 
MessageBox.Show(jsonObj["savedAtGMT0"].Value<DateTime>().ToString()); 

MessageBox.Show(jsonStr);顯示:

{"savedAtGMT0":"20.11.2016 19:39:23"} 

MessageBox.Show(jsonObj["savedAtGMT0"].Value<string>());顯示:

20.11.2016 19:39:23 

MessageBox.Show(DateTime.Parse(jsonObj["savedAtGMT0"].Value<string>()).ToString());顯示:

20.11.2016 19:39:23 

MessageBox.Show(jsonObj["savedAtGMT0"].Value<DateTime>().ToString());拋出異常:

System.FormatException: String was not recognized as a valid DateTime. 

這是爲什麼發生?我沒有指定任何格式,因此我相信它應該使用我的系統的文化格式從DateTime轉換爲字符串和從字符串轉換爲DateTime。

請注意,我相當確定過去使用相同的代碼。

我錯過了一些明顯的東西嗎?謝謝。

回答

2

這是因爲它內部以下列方式使用Convert.ChangeType:

(U) Convert.ChangeType(jvalue.Value, type, (IFormatProvider) CultureInfo.InvariantCulture); 

對於您的情況下,它變得那麼:

(DateTime) Convert.ChangeType(DateTime.UtcNow.ToString(), typeof(DateTime), (IFormatProvider)CultureInfo.InvariantCulture); 

所以它使用InvariantCulture明確。如果你的文化與此不同 - 你會有一個像你觀察到的例外。

請注意,在json中以文化特定的格式存儲日期並不是很好的主意。

+0

顯然。謝謝你的解釋。我從序列化部分刪除了'.ToString()'部分,它工作正常。我不知道那裏是如何出現的。你在哪裏找到引用的代碼btw? – LukAss741

+1

我只是使用「導航到定義」和resharper爲我反編譯代碼,並帶我去反編譯代碼。所以基本上我用Ctrl +單擊了:) – Evk

+0

@ LukAss741如果你沒有Resharper或.Net Reflector,你可以在[GitHub](https:// github)上瀏覽Json.Net的源代碼的.com/JamesNK/Newtonsoft.Json)。相關的代碼行位於[Extensions]類的'Convert (JToken)'方法](https://github.com/JamesNK/Newtonsoft.Json/blob/master/Src/Newtonsoft)的末尾。 JSON/LINQ的/ Extensions.cs#L293)。 –