反序列化时:DateTime 内容“2016-12-30”未按 JSON 的要求以“\/Date(”开始并以“)\/”结束。

seahi 2016-12-06 04:16:55
view上用的easyui datagrid保存数据时将JSON传到服务器端,然后反序列化,代码如下:
string jsonString = Request["BillEntry"];
List<ARBillEntry> entrys = JSON.JsonDeserialize<List<ARBillEntry>>(jsonString.Replace("\"\"", "null"));
如果有日子字段就会出现下面的错误提示:
反序列化对象 属于类型 System.Collections.Generic.List`1[[Seahisoft.Catering.CostMng.Models.ARBillEntry, Seahisoft.Catering.CostMng, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]] 时出现错误。DateTime 内容“2016-12-30”未按 JSON 的要求以“\/Date(”开始并以“)\/”结束。
因为从界面返回的日期格式是:2016/12/6,这种,这个有什么好的解决方案?
...全文
862 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
seahi 2016-12-07
  • 打赏
  • 举报
回复
问题解决了,多谢各位! 代码贴出来共享一下: /// <summary> /// JSON反序列化 /// </summary> /// <param name="jsonString"></param> /// <returns></returns> public static T JsonDeserialize<T>(string jsonString) { string pattern = @"(\d{4}-\d{2}-\d{2})|(\d{4}-\d{2}-\d{2}\s\d{2}:\d{2}:\d{2})"; //string pattern = @"\d{4}-\d{2}-\d{2}\s\d{2}:\d{2}:\d{2}"; MatchEvaluator matchEvaluator = new MatchEvaluator(ConvertDateStringToJsonDate); Regex reg = new Regex(pattern); jsonString = reg.Replace(jsonString, matchEvaluator); DataContractJsonSerializer ser = new DataContractJsonSerializer(typeof(T)); MemoryStream ms = new MemoryStream(Encoding.UTF8.GetBytes(jsonString)); T obj = (T)ser.ReadObject(ms); return obj; } /// <summary> /// 将时间字符串转为Json时间 /// </summary> private static string ConvertDateStringToJsonDate(Match m) { string result = string.Empty; DateTime dt = DateTime.Parse(m.Groups[0].Value); dt = dt.ToUniversalTime(); TimeSpan ts = dt - DateTime.Parse("1970-01-01"); result = string.Format("\\/Date({0}+0800)\\/", ts.TotalMilliseconds); return result; }
seahi 2016-12-07
  • 打赏
  • 举报
回复
引用 12 楼 starfd 的回复:
我的意思是你反序列化的类对应属性设置为string……
噢,好吧,我再试试,实在不行就只好这样了。
  • 打赏
  • 举报
回复
我的意思是你反序列化的类对应属性设置为string……
seahi 2016-12-07
  • 打赏
  • 举报
回复
引用 6 楼 starfd 的回复:
json.net可以指定如何进行序列化的,或者你干脆将你的日期那块属性设置为String,后续再转化为DateTime
本来就是String,JSON内容来至DataGrid的数据源,我无法定义格式啊。
seahi 2016-12-07
  • 打赏
  • 举报
回复
引用 7 楼 sp1234 的回复:
Replace 是什么鬼?
把空字符串转换为NULL,否则反序列化也会报错。
seahi 2016-12-07
  • 打赏
  • 举报
回复
引用 8 楼 sp1234 的回复:
[quote=引用 5 楼 seahi 的回复:] [quote=引用 3 楼 u010717459 的回复:]
new TimeSpan(date.Ticks - new DateTime(1970, 1, 1).Ticks).TotalMilliseconds
;
这我知道,我想知道的是如何把JSON数组里的时间格式替换为符合要求的格式? 否则我根本无法对JSON进行反序列化。[/quote] 你要确定你传来的到底是时间,还是普通的字符串?![/quote] 字符串,JSON格式如下: [ { "FEnterpriseID": "", "FBranchID": "", "FInterID": "", "FEntryID": "", "FItemID": "61c20b1f-3b5f-498b-b2c6-a6cd00bac244", "FNumber": "", "FName": "10001 原料成本", "FQty": "3.00", "FPrice": "4.3000", "FAmount": "12.90", "FAmortizeDateTo": "2016-12-31", "FComment": "" }, { "FEnterpriseID": "", "FBranchID": "", "FInterID": "", "FEntryID": "", "FItemID": "4eb8892a-2f28-4caa-879f-a6cd00bad981", "FNumber": "", "FName": "10003 消耗品", "FQty": "2.00", "FPrice": "4.5000", "FAmount": "9.00", "FAmortizeDateTo": "2016-12-31", "FComment": "" } ]
  • 打赏
  • 举报
回复
引用 5 楼 seahi 的回复:
[quote=引用 3 楼 u010717459 的回复:]
new TimeSpan(date.Ticks - new DateTime(1970, 1, 1).Ticks).TotalMilliseconds
;
这我知道,我想知道的是如何把JSON数组里的时间格式替换为符合要求的格式? 否则我根本无法对JSON进行反序列化。[/quote] 你要确定你传来的到底是时间,还是普通的字符串?!
  • 打赏
  • 举报
回复
Replace 是什么鬼?
  • 打赏
  • 举报
回复
json.net可以指定如何进行序列化的,或者你干脆将你的日期那块属性设置为String,后续再转化为DateTime
seahi 2016-12-07
  • 打赏
  • 举报
回复
引用 3 楼 u010717459 的回复:
new TimeSpan(date.Ticks - new DateTime(1970, 1, 1).Ticks).TotalMilliseconds
;
这我知道,我想知道的是如何把JSON数组里的时间格式替换为符合要求的格式? 否则我根本无法对JSON进行反序列化。
草青工作室 2016-12-07
  • 打赏
  • 举报
回复
var obj = new ... JavaScriptSerializer serialize = new JavaScriptSerializer(); //针对日期序列化时区的转化 var json = Regex.Replace(serialize.Serialize(obj), @"\\/Date\((-?\d+)\)\\/", match => { var dt = new DateTime(1970, 1, 1); dt = dt.AddMilliseconds(long.Parse(match.Groups[1].Value)); dt = dt.ToLocalTime(); return dt.ToString("yyyy-MM-dd HH:mm:ss"); }); return json;
雷诺兹 2016-12-06
  • 打赏
  • 举报
回复
引用 3 楼 u010717459 的回复:
new TimeSpan(date.Ticks - new DateTime(1970, 1, 1).Ticks).TotalMilliseconds
;
date..ToUniversalTime().Ticks
雷诺兹 2016-12-06
  • 打赏
  • 举报
回复
new TimeSpan(date.Ticks - new DateTime(1970, 1, 1).Ticks).TotalMilliseconds
;
seahi 2016-12-06
  • 打赏
  • 举报
回复
引用 1 楼 u010717459 的回复:
转成vdate
咋个转法?
雷诺兹 2016-12-06
  • 打赏
  • 举报
回复
转成vdate

62,046

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧