原文:[C#] JObject 會將 json 中含有時區的訊息遺失?
.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"));