2014-02-06 80 views
1

我遇到了Json.NET解析器的問題。根據documentation,僅使用ToString()而沒有特殊的轉換器應該使Json保持不變。爲什麼Json.NET解析器會自動本地化它解析的日期?

但是,我的Json字符串正在被修改,它的日期會自動本地化,並且會給我造成各種各樣的問題。例如,當我給它以下字符串:

{ 
    "_type": "Basic", 
    "id": "44902a0f-7842-3a2d-83bf-a874ce0b47a1", 
    "description": "TestBasicDescription", 
    "participation": 1.000000000000000, 
    "inception_date": "2014-02-06T20:34:00.925000+00:00", 
    "expiry_date": "0001-01-01T00:00:00+00:00" 
} 

我期望代碼

Newtonsoft.Json.Linq.JObject.Parse(content).ToString(Formatting.None); 

,以產生一個字符串,它實際上是相同的。然而,我得到的是:

{ 
    "_type": "Basic", 
    "id": "44902a0f-7842-3a2d-83bf-a874ce0b47a1", 
    "description": "TestBasicDescription", 
    "participation": 1.0, 
    "inception_date": "2014-02-06T16:34:00.925-04:00", 
    "expiry_date": "0001-01-01T20:00:00-04:00" 
} 

正如你所看到的,我的日期已經被本地化了。

更糟糕的是,在邊界日期的情況下(如上面所示的DateTime.MinValue),這個自動本地化的值實際上是錯誤的。時區偏移導致小時值環繞,並且由於日期不能更低,所以它不會更改,從而有效地將日期轉換爲DateTime.MinValue加上1天:將時間轉換回UTC時間(因爲它原來是這樣)日期變爲"0001-01-02T00:00:00+00:00"。提示單元測試爆炸。

爲什麼Json.Net的行爲不像它說的那樣?有什麼辦法可以解析輸入Json然後ToString()究竟是,因爲它是?

回答

7

等@JonSkeet!回來並取消刪除你的答案!

相關的串行器設置是這樣的:DateParseHandling = Newtonsoft.Json.DateParseHandling.None(你提到過),我只是不知道如何在這種情況下應用它,直到@ L.B。提到了JsonConverter。

這解決了這個問題。

Newtonsoft.Json.JsonConvert.DeserializeObject(content, 
    new Newtonsoft.Json.JsonSerializerSettings() { 
    DateParseHandling = Newtonsoft.Json.DateParseHandling.None }).ToString(); 

回饋我:"expiry_date": "0001-01-01T00:00:00+00:00"。仍非常可疑的默認行爲是與你的狗屎混亂,但你去:)

+0

你是我的英雄 – Mugen