2013-07-25 229 views
0

我修改了WebAPI JSON.Net序列化以使用JavaScriptDateTimeConverter。該計劃是獲得jscript日期對象而不是ISO 8601格式化字符串。但不幸的是帖子的時候我做的請求,像這樣的jQuery:在WebAPI中修改JSON.NET

$.ajax({ 
     type: "POST", 
     contentType: "application/json; charset=utf-8", 
     url: "#UrlToService", 
     dataType: "json", 
     data: JSON.stringify(args), 
     success: function (data) { 
      callSucceeded(data); 
     }, 
     error: function (jqXHR, textStatus, errorThrown) { 
      BJ.GenericWebAPIFailMethod(jqXHR); 
     } 
    }); 

錯誤:輸入,textStatus是parseerror和errorThrown是給我這個信息: 語法錯誤:JSON.parse:意外的關鍵字 回報window.JSON。解析(數據); jQuery的1.7.2.js(線564)我返回的JSON對象的

部分看起來像:

"CreatedOn": Date {Thu Jul 25 2013 12:54:36 GMT+0200 (Central Europe Standard Time)} 
"DisplayName": "Toronto, ON, Canada" 
"Description": "12:54" 

所以這的確是我的格式化日期的要求,但失敗以後解析。

任何想法如何實現我想要的?

p.s.這是我怎麼做的,在Global.asax中(asp.net web表單):

var formatters = GlobalConfiguration.Configuration.Formatters; 
var jsonFormatter = formatters.JsonFormatter; 
var settings = jsonFormatter.SerializerSettings; 
settings.Converters.Add(new JavaScriptDateTimeConverter()); 
+0

爲什麼你需要/想在你的Web API中使用'JavaScriptDateTimeConverter'?如果你把它作爲一個ISO 8601日期,那麼在jQuery反序列化響應之後,你可以簡單地通過'var date = new Date(data.CreatedOn);'將日期字符串轉換爲一個Date對象。 –

+0

問題在於我們之前使用過Web方法,現在我們正在將該代碼移至WebAPI。所以我將不得不手動更改大量的jscript代碼。 – pajics

+0

在您轉移到Web API之前,您的舊Web方法格式的日期是如何的? –

回答

2

使用標準的日期轉換器,串行化的WebAPI日期爲任一ISO 8601格式或Microsoft格式字符串,這取決於串行器DateFormatHandling設置。

使用IsoDateFormat,JSON的應該是這樣的:

{ "CreatedOn" : "2013-07-26T10:33:16Z" } 

使用MicrosoftDateFormat,JSON的應該是這樣的:

{ "CreatedOn" : "/Date(1374749676000)/" } 

在客戶端,jQuery的可以反序列化包含任意JSON這兩種日期格式,但它不會自動將日期字符串轉換爲Date對象,如您所見。

如果換出標準的日期轉換器在服務器上的JavaScriptDateTimeConverter,那麼JSON將呈現這樣的代替:

{ "CreatedOn" : new Date(1374749676000) } 

這在技術上是無效的JSON(注意有沒有引號,和JSON沒有任何其他方式來表示日期而不是字符串)。 jQuery不能反序列化這種格式,並會拋出一個錯誤。

據我所知,如果您打算以文本形式獲取數據,然後將其傳遞給exec(),那麼您將使用JavaScriptDateTimeConverter,以便將整個字符串直接解釋爲JavaScript。

var obj = eval('(' + data + ')'); 

這可能不是,雖然最好的解決方案出於安全考慮。

如果你需要將你的日期反序列化到Date對象jQuery,我認爲你最好的選擇是堅持ISO 8601格式,然後使用jQuery擴展在客戶端進行轉換。這裏是一個​​它談論如何做到這一點,並有一些代碼。 [免責聲明:我自己並未使用此解決方案,因此無法保證它是否有效。]

另請參閱this question,其中提供了許多不同的解決方法。

+0

感謝您的幫助,我們決定採用iso8601 :)。那篇博文的一個問題是它不適用於複雜的對象。因此,如果我們有一個具有date類型參數的對象,那麼該解決方案將不會遍歷所有屬性,而是隻返回null。但是,如果有人想自己編寫解析器,這是一個有用的參考... – pajics