我有一个使用以下序列化代码的Nancy JSON REST服务......
FormatterExtensions.AsJson(this.Response, insightManager.CaseSummary(x.caseId));
然后由...来消毒......
public static T ParseResponseForObject<T>(string response)
{
var javaScriptSerializer = new JavaScriptSerializer();
try
{
return javaScriptSerializer.Deserialize<T>(response);
}
catch (Exception ex)
{
throw new Exception(response, ex);
}
}
insightManager.CaseSummary(x.caseId)代码返回包含可为空的DateTime的类的实例。
问题是在序列化/反序列化过程中,日期会丢失一个小时,我认为这是某种UTC偏移。这有点令人讨厌,因为我只想要日期部分,所以看起来所有日期都是它们真正的前一天。
我已经看到很多帖子在javascript中修复tis但我不确定如何在我的代码的两个部分都使用“标准”serilasers时应用它们。
答案 0 :(得分:1)
所以,我最终得到了答案。基本上我只需要在反序列化日期之后调用.ToLocalTime()以确保我得到我需要的结果。这里为什么http://www.west-wind.com/weblog/posts/2008/Sep/03/Watch-out-for-Date-Kind-in-JSON-Deserialization
的一个非常好的解释但是,简而言之,当您序列化为JSON时,日期始终会转换为UTC时间,因此从反序列中返回的日期将始终为UTC日期,因此您需要将其转换回本地时间。
为了防止其他人遇到这个问题,我调整了我的ParseResponseForObject<T>
函数,以便始终将本地时间用于任何DateTime或DateTime?...
public static T ParseResponseForObject<T>(string response)
{
var javaScriptSerializer = new JavaScriptSerializer();
try
{
var obj = javaScriptSerializer.Deserialize<T>(response);
var props = obj
.GetType()
.GetProperties(BindingFlags.Instance | BindingFlags.Public);
foreach (var pi in props)
{
if (pi.PropertyType == typeof(DateTime))
{
var origDt = (DateTime)pi.GetValue(obj, null);
pi.SetValue(obj, origDt.ToLocalTime(), null);
}
else if (pi.PropertyType == typeof(DateTime?))
{
var origDt = (DateTime?)pi.GetValue(obj, null);
if (origDt.HasValue)
{
pi.SetValue(obj, origDt.Value.ToLocalTime(), null);
}
}
}
return obj;
}
catch (Exception ex)
{
throw new Exception(response, ex);
}
}