.NET 環境操作 json 時一般都是使用 JSON.NET,效能不錯又有許多方便的物件可以使用,之前黑大就有分享一篇 使用dynamic簡化Json.NET JObject操作,不過最近在使用 JObject 時有踩到一個雷與大家分享。
JObject 預設會對它認為是時間的字串進行轉換,但若我們使用 String 的方式輸出則會遺失時區的資訊,範例如下:
string json = "{\"DateTime\":\"2012-12-21T08:00:00+0800\"}"; var jObj = JObject.Parse(json); Console.WriteLine(jObj.Value<string>("DateTime"));
若改用 DateTime 輸出則可以正常印出時區的資訊,範例如下:
string json = "{\"DateTime\":\"2012-12-21T08:00:00+0800\"}"; var jObj = JObject.Parse(json); Console.WriteLine(jObj.Value<DateTime>("DateTime").ToString("yyyy-MM-dd HH:mm:ss \"GMT\"zzz"));
但若想要輸出 String 又想要保留原始 json 中的完整 ISO8601 內容怎麼辦?
沒問題,JSON.NET 都幫我們預留方法了,可以使用 JObject.Load()
並改變 JsonTextReader.DateParseHandling
即可,範例如下:
string json = "{\"DateTime\":\"2012-12-21T08:00:00+0800\"}"; JObject jObj = null; using (var sr = new StringReader(json)) using (var jtr = new JsonTextReader(sr)) { jtr.DateParseHandling = DateParseHandling.None; jObj = JObject.Load(jtr); } Console.WriteLine(jObj.Value<string>("DateTime"));