【问题标题】:Why is RestSharp deserializing two dates differently?为什么 RestSharp 以不同的方式反序列化两个日期?
【发布时间】:2013-04-23 16:15:45
【问题描述】:

我有一个返回这个的 rest 调用(使用 Chrome 中的 Advance Rest Client 进行测试):

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?

【问题讨论】:

  • 两者都是 UTC 日期时间的有效 ISO8601 表示(对小数部分的位数没有限制)。尝试逗号作为分隔符 - 我相信原始分隔符是点,但根据 Wikipedia 较新版本的建议使用逗号...
  • 在 MyObject 中 UTC1 和 UTC2 是否定义为同一类型?
  • @cgotberg,是的,它们是同一类型(日期时间)
  • 我在 Newtonsoft.Json 中尝试了您的示例,但它没有执行奇怪的 datetimeoffset 开关。您可以使用 RestSharp 获取原始响应,然后使用 var myObject = JsonConvert.Deserialize(jsonString) 进行反序列化。
  • @cgotberg,谢谢。如果您想将其作为答案,我会接受 - 除了更改当前计算机的时区之外,我想不出另一种解决方法

标签: c# .net asp.net-web-api deserialization restsharp


【解决方案1】:

使用Json.NET 代替内置的RestSharp 反序列化器进行反序列化。

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

【讨论】:

    【解决方案2】:

    为方便起见发布此内容:

    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&lt;T&gt;,并在后台使用了 Json.net。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-09-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-07-16
      • 1970-01-01
      相关资源
      最近更新 更多