2013-04-23 4 views
4

나는 (할 크롬에서 사용하는 사전 나머지 클라이언트 테스트)이 반환하는 나머지 호출이 있습니다RestSharp가 두 날짜를 비 직렬화하는 이유는 무엇입니까?

MyObject: [22] 
0: { 
ID: "123456" 
UTC1: "2013-04-19T03:12:32Z" 
UTC2: "2013-04-19T03:12:36.994Z" 
} 

응답을 잡고 오브젝트로 직렬화 코드는 다음과 같습니다

IRestResponse<List<MyObject>> response = client.Execute<List<MyObject>>(request); 

응답 개체를 보면 날짜 중 하나가 잘못되었습니다. 나는 그것을 검사하거나 어떤 방법으로 개체를 사용하는 경우 난이 얻을 :

UTC1: 4/19/2013 3:12  
UTC2: 4/18/2013 9:12:36 PM <--CONVERTED!! 

내가 응답에 반환되는 시간으로 직렬화되는 둘 필요가 현지 시간으로 UTC/GMT로 변환되지 않습니다. 위에서 보듯이 한 값은 UTC 값을 유지하지만 다른 값은 내 시간대로 변환됩니다. 두 가지 모두 Convert.DateTime 함수를 통해 실행되고 있다고 생각했지만 문자열을 사용하여 수행하면 두 값이 현지 시간으로 변환 된 것으로 나타납니다. 원본 값 (변환 된 값)이 ISO 8601 형식 (정확도가 너무 높음)을 정확히 준수하지 않는다는 것을 알았습니다. 불행히도 그것은 지금 내가해야 할 데이터입니다.

RestSharp에서 두 날짜가 모두 UTC인지 확인하는 방법을 알려줄 사람이 있습니까?

+0

둘 다 유효한 UTC 날짜 시간 ISO8601 표현입니다 (분수 부분의 자릿수에 대한 제한이 없음). 구분 기호로 쉼표를 사용하십시오. 원래 구분 기호는 점이지만, [Wikipedia] (http://en.wikipedia.org/wiki/ISO_8601)에 따르면 쉼표를 사용하는 최신 버전의 조언이 있습니다. –

+0

MyObject에는 UTC1과 UTC2가 정의되어 있습니다. 같은 유형으로? – cgotberg

+0

@cgotberg, 예, 그들은 동일한 유형입니다 (DateTime) – Mario

답변

7

Json.NET을 사용하여 RestSharp 디시리얼라이저 대신 기본 직렬화를 수행하십시오.

response = client.Execute(request);  
var myObjects = JsonConvert.Deserialize<List<MyObject>>(response) 
1

편의를 위해이 게시 :

private class CustomRestClient : RestClient 
     { 
      public CustomRestClient(string baseUrl) : base(baseUrl) { } 

      private IRestResponse<T> Deserialize<T>(IRestRequest request, IRestResponse raw) 
      { 
       request.OnBeforeDeserialization(raw); 
       var restResponse = (IRestResponse<T>)new RestResponse<T>(); 
       try 
       { 
        restResponse = ResponseExtensions.toAsyncResponse<T>(raw); 
        restResponse.Request = request; 
        if (restResponse.ErrorException == null) 
        { 

         restResponse.Data = JsonConvert.DeserializeObject<T>(restResponse.Content); 
        } 
       } 
       catch (Exception ex) 
       { 
        restResponse.ResponseStatus = ResponseStatus.Error; 
        restResponse.ErrorMessage = ex.Message; 
        restResponse.ErrorException = ex; 
       } 
       return restResponse; 
      } 



      public override IRestResponse<T> Execute<T>(IRestRequest request) 
      { 
       return Deserialize<T>(request, Execute(request)); 
      } 
     } 

이 그냥 Execute<T>을 무시하고 후드 Json.net를 사용, 내가 함께 넣어 간단한 코드입니다.

관련 문제