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

时间:2010-07-12 22:14:59

标签: c# web-services json

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

但是当json发送时,它被设置为00:00:00 这甚至可以吗?

谢谢! -Kevin

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

5 个答案:

答案 0 :(得分:9)

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

{"PassedTimeSpan":"P1DT2H3M4S"}

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

所以看起来格式是:

  

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

其中:

  

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

,可省略

答案 1 :(得分:5)

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

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

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

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

答案 2 :(得分:4)

这些答案都已过时,所以我想我会提供更新的更好答案。 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

答案 3 :(得分:2)

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

将TimeSpan设置为30分钟

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

此解决方案适合我。我正在使用MVC 4.0和.Net framework 4.0。

答案 4 :(得分:-1)

http://msdn.microsoft.com/en-us/library/bb412179.aspx

The JSON serializer throws a serialization exception for data contracts that have multiple members with the same name, as shown in the following sample code.

Copy

[DataContract]
public class TestDuplicateDataBase
{
    [DataMember]
    public int field1 = 123;
}
[DataContract]
public class TestDuplicateDataDerived : TestDuplicateDataBase
{
    [DataMember]
    public new int field1 = 999;
}