使用 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的主要内容,如果未能解决你的问题,请参考以下文章

protobuf-net:不正确的线型反序列化 TimeSpan

如何将 TimeSpan 序列化为 XML

使用C# json 二维数组 反序列化

c# 多个json字符串反序列化

使用动态键反序列化 JSON

使用JSON.NET反序列化json - 无法反序列化,因为类型需要一个JSON数组c#