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



這裡的資訊對您有用嗎?歡迎斗內給我