我将一些数据从本地应用程序发送到另一个应用程序(ASP.NET MVC)。数据是DTO数组。我正在我的本地机器上测试它。
本地应用程序是Web窗体并使用服务发送数据。我不使用JsonResult。
序列化的DTO被正确发送,但是在MVC端错误地反序列化日期,比发送的日期落后一天。
DTO课程如下所示:
[DataContract]
public class ProjectInfoDto
{
[DataMember]
public long ProjectId { get; set; }
[DataMember]
public string ProjcetCode { get; set; }
[DataMember]
public DateTime BeginDate { get; set; }
[DataMember]
public DateTime FinalDate { get; set; }
}
我使用以下方法序列化数据:
public static string JsonSerialize<T>(T obj)
{
var serializer = new DataContractJsonSerializer(obj.GetType());
var ms = new MemoryStream();
serializer.WriteObject(ms, obj);
string retVal = Encoding.Default.GetString(ms.ToArray());
ms.Dispose();
return retVal;
}
发送到MVC应用程序的JSON看起来像这样(具有正确的日期):
{"ProjectId":"222","ProjcetCode":"OP9089","BeginDate":"/Date(1461790800000+0300)/","FinalDate":"/Date(1557435600000+0300)/" }
接收数据的方法如下所示:
public ActionResult GetProjectData(ProjectInfoDto[] info) {...}
原始日期是(来自数据库):
BeginDate - &gt; 2016-04-28 00:00:00.000
FinalDate - &gt; 2019-05-10 00:00:00.000
查看收到的数组时MVC端的日期:
BeginDate - &gt; 2016-04-27 00:00:00.000
FinalDate - &gt; 2019-05-09 00:00:00.000
我不知道为什么日期是收到后的一天。
答案 0 :(得分:0)
我在这个问题Is there a way to override how DataContractJsonSerializer serializes Dates?中找到了一个建议。
问题的答案建议创建一个实例方法并使用
[OnSerializing]
属性进行修饰。这将允许自定义序列化某些属性。
以下完整代码:
[DataContract]
public class ProjectInfoDto
{
[DataMember(Name = "BeginDate")]
private string beginDate;
[DataMember(Name = "ExecutieDataFinal")]
private string finalDate;
[DataMember]
public long ProjectId { get; set; }
[DataMember]
public string ProjcetCode { get; set; }
public DateTime BeginDate { get; set; }
public DateTime FinalDate { get; set; }
[OnSerializing]
void OnSerializing(StreamingContext context)
{
beginDate = BeginDate.ToString("yyyy-MM-dd", CultureInfo.InvariantCulture);
finalDate = FinalDate.ToString("yyyy-MM-dd", CultureInfo.InvariantCulture);
}
}
我们的想法是保持DateTime属性不变,并使用私有字符串字段进行序列化。在OnSerializing方法中,将DateTime属性转换为所需的格式。根据我的问题评论中的建议,我使用了ISO-8601格式(“yyyy-MM-dd”)。