2013-03-15 62 views
2

我有一個web api控制器方法,它接受一個組合對象,其中一個屬性是DateTime。當我將對象作爲XML發佈時,一切正常。如果我將它作爲JSON發佈,它會失敗。Json DateTime轉換在web api中返回新的日期時間

爲了獲得更多關於它爲什麼會失敗的信息,我添加了一個自定義日期時間轉換器,只是重用了Json.Net附帶的基本IsoDateTimeConverter,並且通過在轉換後的值上放置了一個斷點可以看到該值可以很好地轉換,但是當它到達模型時,該屬性將填充新的日期時間,而不是我要發送的值。發送與XML完全相同的模型可以正常工作。

對於事件的順序以及它如何從被轉換成日期時間對象然後在模型綁定時立即丟失,我有點困惑。我在交互的兩端使用Json.Net IsoDateTimeConverter進行序列化和反序列化。

JSON設置:

NullValueHandling = NullValueHandling.Ignore, 
DateFormatHandling = DateFormatHandling.IsoDateFormat, 
DateTimeZoneHandling = DateTimeZoneHandling.Utc, 
Converters = new JsonConverter[] 
{ 
    new StringEnumConverter(), 
    new IsoDateTimeConverter() 
} 

定製轉換器(使用IsoDateTimeConverter)在web API端用於deserialisation:

public class CustomDateTimeConverter : DateTimeConverterBase 
{ 
    IsoDateTimeConverter isoConverter; 

    public CustomDateTimeConverter() 
    { 
     isoConverter = new IsoDateTimeConverter(); 
    } 

    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) 
    { 
     isoConverter.WriteJson(writer, value, serializer); 
    } 

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) 
    { 
     var returned = isoConverter.ReadJson(reader, objectType, existingValue, serializer); 
     return returned; 
    } 
} 

在模型日期屬性(在兩端)

public DateTime DateOfBirth { get; set; } 

張貼Json格式:

"DateOfBirth":"1980-02-01T00:00:00" 

值在轉換器:在控制器

{01/02/1980 00:00:00} 

值在模型:

{01/01/0001 00:00:00} 

breakpointed被顯示正確deserialised日期時間時,返回的變量,但是該模型直之後是一個新的約會時間。

對此如何可以反序列化和決定它不是直接的!任何幫助不勝感激。

在進一步調查中,似乎json binder還無法綁定屬性 - 基本字符串屬性的加載沒有正確綁定,因此這可能是不同問題的一部分。

回答

0

事實證明,這不是用JSON做的 - JSON的是deserialising正確的,因爲我已經通過重寫日期轉換器發現。問題在於該對象需要在Web API下需要[DataMember(IsRequired = true)]的字段,以便強制執行必需的字段。問題在於對象的其餘部分沒有用[DataMember]屬性修飾,所以它們被忽略 - 我假定模型被綁定。

刺激的錯誤追蹤,特別是當決議是如此簡單...

3

Json不做日期。將它們作爲字符串傳回並在客戶端腳本中解析它們。

http://www.hanselman.com/blog/OnTheNightmareThatIsJSONDatesPlusJSONNETAndASPNETWebAPI.aspx

+0

博客文章的結論是使用我在博客的代碼示例中發佈的json serialiser設置。我將在json日期被轉換時更新一些更清晰的問題,它只是在轉換和模型綁定之間出現錯誤。 – 2013-03-15 16:00:21

+0

可能有助於發佈你的模型的相關行(你有'DateTime DateOfBirth {get; set;}'?) – paul 2013-03-15 16:04:22

+0

是的 - 我已經更新了問題 – 2013-03-15 16:09:22

0
function ConvertDateTime(dt) { 
     var cdt = new Date(); 
     var dateString = dt.substr(6); 
     var currentTime = new Date(parseInt(dateString)); 
     var month = currentTime.getMonth(); 
     var m = months[month]; 
     var day = currentTime.getDate(); 
     var year = currentTime.getFullYear(); 
     var hr = currentTime.getHours(); 
     var mi = currentTime.getMinutes(); 
     var date = day + "/" + m + "/" + year + " " + hr + ":" + mi; 
     return date; 
    } 
相關問題