面对休闲服务序列化中Timespan的问题

时间:2015-01-13 15:29:23

标签: json wcf rest http-headers httpresponse

我正在使用REST服务从Db获取数据。 在我的班级中,我有数据类型TimeSpan的属性“UploadTime”。 时间跨度是根据日期和响应之间的差异计算出来的,我得到的响应是:

ArrayOfUploadUI xmlns="http://schemas.datacontract.org/2004/07/NMS.ApplicationService.HIM.Objects" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
 <UploadUI>
  <UID>1</UID> 
  <DateCompleted>2015-01-08T10:46:25.25</DateCompleted> 
  <DateNotified>2015-01-07T10:46:25.25</DateNotified> 
  <DateDictationStartTime i:nil="true" /> 
  <DateDictationEndTime i:nil="true" /> 
  <UploadTime>P1D</UploadTime> 
  <ExistsOnBackend>false</ExistsOnBackend> 
  </UploadUI>
  </ArrayOfUploadUI>

。 我在尝试获取数据时遇到以下异常:

using (HttpResponseMessage response = await _HttpClient(session).GetAsync(apiUrl))
            {
                if (response.IsSuccessStatusCode)
                    result = await response.Content.ReadAsAsync<T>();
                else
                    await _HandleInvalidResponseAsync(response);
            }

我在“response.Content.ReadAsAsync();”。

中遇到问题

错误是:

Error converting value "P1D" to type 'System.Nullable`1[System.TimeSpan]'. Path '[0].UploadTime', line 1, position 518.
   at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.EnsureType(JsonReader reader, Object value, CultureInfo culture, JsonContract contract, Type targetType).

我用Google搜索,然后我知道WCF将“timeSpan”数据类型从“1:0:0:00”序列化为“P1D”。

我的问题是如何在响应级别反序列化。

1 个答案:

答案 0 :(得分:0)

我已在源级别对日期进行了格式化,问题得到了解决。

JsonSerializerSettings dateFormatSettings = new JsonSerializerSettings
            {
                DateFormatHandling = DateFormatHandling.MicrosoftDateFormat
            };
            string jsonNMSPlatformObject = JsonConvert.SerializeObject(nmsPlatformObject,dateFormatSettings);
            using (HttpContent httpContent = new StringContent(jsonNMSPlatformObject))
            {
                httpContent.Headers.ContentType = new MediaTypeHeaderValue(JsonMedaType);
                var request = new HttpRequestMessage(HttpMethod.Delete, apiUrl);
                request.Content = httpContent;
                using (HttpResponseMessage response = await _HttpClient(session).SendAsync(request))
                {
                    if (response.IsSuccessStatusCode)
                        return;
                    else
                        await _HandleInvalidResponseAsync(response, jsonNMSPlatformObject);
                }
            }