使用JSON序列化/反序列化TimeSpan

31

我正在尝试使用Newtonsoft.Json.JsonConvert对时间间隔进行反序列化/序列化,但是当JSON被发送时,它被设置为00:00:00。

这样做是否可能?


1
你使用哪个序列化程序?JavaScriptSerializer?DataContractJsonSerializer?你能发一个小的代码示例,说明它为什么不工作吗? - Oleg
我使用Newtonsoft.json.jsonconvert。所以我的做法是:JsonConvert.SerializeObject(TimeSpan); - Kevin
4个回答

15

我尝试了#Jessycormier的方法,但对我没用。 我运行了DataContractJsonSerializer来查看它会生成什么,我发现它给了我一个更像这样的值。

{"PassedTimeSpan":"P1DT2H3M4S"}

上面显示的数值为1天,2小时,3分钟和4秒。

因此,格式应为:

[-]P[{days}D][T[{hours}H][{min}M][{sec}S]]

其中:

- 表示负时间跨度,正值可省略
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] == undefined ? "" : timeArray[1]; var hr = "00" + h; var hour = hr.substr(hr.length - 2, 2); var m = timeArray[2] == undefined ? "" : timeArray[2]; var min = "00" + m; var minute = min.substr(min.length - 2, 2); return hour + ":" + minute; } - LoBo
它返回了一个Newtonsoft.Json.JsonSerializationException: '无法将当前JSON对象(例如{"name":"value"})反序列化为类型'System.TimeSpan',因为该类型需要一个JSON原始值(例如字符串、数字、布尔值、null)才能正确反序列化。 - EgoPingvina
尝试使用DataContractJsonSerializer。 - RonnBlack

5

如果您应用准确的格式,可以使用TimeSpan。格式是:“0.00:00:00.0000”

将TimeSpan设置为30分钟

var jsonData = JSON.stringify({
    myDataObject: {
         TimeSpanValue : "0.00:" + $("#InputWithMinVal").val() + ":00.0"
    }
});

这个方案适用于我。我正在使用带有 .Net Framework 4.0 的 MVC 4.0。

5
我已经弄清楚了,显然这是微软的设计缺陷...
因为TimeSpan不能是一个无参对象。XML无法重新创建它。
看看这个网站。 http://forums.silverlight.net/forums/p/51793/135450.aspx 因此,TimeSpan无法转换。一个简单的方法是将TimeSpan更改为字符串,然后发送该字符串。并使用TimeSpan.TryParse(String);

12
XML与您的问题有何关系? - Chris Pfohl
2
@Crisfole 我认为他指的是他正在使用的序列化器(很多序列化器都可以将数据序列化为XML和JSON格式)。 - Josh Mouch

2
这些答案都已经过时了,所以我想提供一个更新、更好的答案。现在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

8
我没有看到任何关于moment.js或JavaScript的提及。 - Demortes

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接