使用 JSON 序列化/反序列化 TimeSpan
Posted
技术标签:
【中文标题】使用 JSON 序列化/反序列化 TimeSpan【英文标题】:Using JSON to Serialize/Deserialize TimeSpan 【发布时间】:2011-03-15 01:06:23 【问题描述】:我正在尝试使用Newtonsoft.Json.JsonConvert 反序列化/序列化时间跨度,但是当发送 JSON 时,它被设置为 00:00:00。
这有可能吗?
【问题讨论】:
您使用哪个序列化程序? javascript序列化器? DataContractJsonSerializer?你能发布一个不起作用的小代码示例吗? 我使用 Newtonsoft.json.jsonconvert。所以我要做的是。 JsonConvert.SerializeObject(TimeSpan); 【参考方案1】:我尝试了#Jessycormier 的方法,但它对我不起作用。 我运行 DataContractJsonSerializer 来查看它会生成什么,我发现它给了我一个看起来更像这样的值。
"PassedTimeSpan":"P1DT2H3M4S"
上面显示的值是 1 天 2 小时 3 分钟 4 秒。
所以看起来格式是:
[-]P[daysD][T[hoursH][minM][secS]]
地点:
- 表示负时间跨度,正值省略 P 必须是第一个字符(除非是负时间值) T 必须在时间跨度的时间部分之前。 [] = 如果为 0,则可以省略的可选部分。
【讨论】:
感谢您写下通用模板!基于此,我可以编写下一个函数: formatTime = function (jsonTime) var re = /-?P(?:\d+D)?(?:T(?:(\d+)H)?(( \d+)M)?((\d+)S)?)?/; var timeArray = re.exec(jsonTime); var h = timeArray[1] == 未定义? "" : timeArray[1]; var hr = "00" + h; var hour = hr.substr(hr.length - 2, 2); var m = timeArray[2] == 未定义? "" : timeArray[2]; var min = "00" + m; var min = min.substr(min.length - 2, 2);返回小时+“:”+分钟; 它返回给我Newtonsoft.Json.JsonSerializationException: 'Cannot deserialize the current JSON object (e.g. "name":"value") into type 'System.TimeSpan' because the type requires a JSON primitive value (e.g. string, number, boolean, null) to deserialize correctly.
@egoPinvina 试试 DataContractJsonSerializer【参考方案2】:
我想通了,显然这是一个MS设计缺陷......
因为 TimeSpan 不能是无参数对象。 XML 无法重新创建它。
看看这个网站。 http://forums.silverlight.net/forums/p/51793/135450.aspx
所以。因此无法转换 TimeSpan。一个简单的方法是 将时间跨度更改为字符串,然后将字符串发送过来。 并使用 TimeSpan.TryParse(String);
【讨论】:
XML 与您的问题有什么关系? @Crisfole 我认为他指的不是“XML”,而是他使用的任何序列化程序(其中很多都序列化为 XML 和 JSON)。【参考方案3】:这些答案都已经过时了,所以我想我会提供一个更新的更好的答案。 moment.js 现在直接支持.NET Timespan
序列化格式。
从 2.1.0 版开始,支持此功能:
moment.duration('23:59:59');
moment.duration('23:59:59.999');
moment.duration('7.23:59:59.999');
moment.duration('23:59'); // added in 2.3.0
【讨论】:
我没有看到任何提及 moment.js 或任何 javascript 的内容。【参考方案4】:如果您应用确切的格式,您可以使用 TimeSpan。格式为:“0.00:00:00.0000”
将 TimeSpan 设置为 30 分钟
var jsonData = JSON.stringify(
myDataObject:
TimeSpanValue : "0.00:" + $("#InputWithMinVal").val() + ":00.0"
);
这个解决方案对我有用。我将 MVC 4.0 与 .Net 框架 4.0 一起使用。
【讨论】:
以上是关于使用 JSON 序列化/反序列化 TimeSpan的主要内容,如果未能解决你的问题,请参考以下文章