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

Kev*_*vin 12 c# json web-services

我正在尝试反序列化/序列化一个时间跨度,

但是当json被发送时,设置为00:00:00这是否可能呢?

谢谢!-Kevin

顺便说一句,语言是C#,使用Visual Studio 2008.

Ron*_*ack 10

我尝试了#Jessycormier的方法,它对我不起作用.我运行DataContractJsonSerializer来查看它会产生什么,我发现它给了我一个看起来更像这样的值.

{"PassedTimeSpan":"P1DT2H3M4S"}
Run Code Online (Sandbox Code Playgroud)

上面显示的值是1天,2小时,3分钟和4秒.

所以看起来格式是:

[ - ] P [{天} d] [T [{小时} H] [{分钟} M] [{秒} S]]

哪里:

- 表示负时间跨度,省略正值
P必须是第一个字符(除非负时间值)
T必须在时间跨度的时间部分之前.
[] =可选部分,如果为0则可以省略.

  • 它是ISO 8601持续时间:https://en.wikipedia.org/wiki/ISO_8601#Durations (3认同)

Kev*_*vin 5

我明白了,显然这是一个MS设计缺陷......

由于TimeSpan不能是无参数对象.XML无法重新创建它.

看看这个网站. http://forums.silverlight.net/forums/p/51793/135450.aspx

所以.因此无法转换TimeSpan.一种简单的方法是将时间跨度更改为字符串,然后将字符串发送出去.并使用TimeSpan.TryParse(String);

  • XML与您的问题有什么关系? (6认同)
  • @Crisfole 我认为他指的不是“XML”,而是他使用的任何序列化器(其中很多序列化为 XML 和 JSON)。 (2认同)

Jes*_*ier 5

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

将时间跨度设置为 30 分钟

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

这个解决方案对我有用。我正在使用 MVC 4.0 和 .Net Framework 4.0。


Joh*_*ter 5

这些答案都是过时的,所以我想我会提供一个更新的更好的答案。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
Run Code Online (Sandbox Code Playgroud)

  • 我在其中没有看到任何提及 moment.js 或任何 javascript 的内容。 (3认同)