2010-07-12 43 views
9

我试图反序列化/序列化一个时间跨度,使用JSON将序列化/反序列时间跨度

但当JSON是送它设置为00:00:00 是这甚至可能做什么?

谢谢! -Kevin

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

+1

串行使用哪? JavaScriptSerializer?DataContractJsonSerializer?你可以发布一个不起作用的小代码示例吗? – Oleg 2010-07-12 22:20:33

+0

我使用Newtonsoft.json.jsonconvert。 所以我做的是。 JsonConvert.SerializeObject(TimeSpan); – Kevin 2010-07-13 13:36:52

回答

4

我想通了,很显然这是一个MS设计缺陷...

由于时间跨度不能是一个无参数的对象。 XML无法重新创建它。

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

所以。因此TimeSpan无法转换。执行此操作的简单方法是 将时间范围更改为字符串,然后发送该字符串。 并使用TimeSpan.TryParse(String);

+6

XML与你的问题有什么关系? – Crisfole 2014-06-10 12:44:43

+0

@Crisfole我认为,而不是“XML”,他指的是他使用的任何序列化器(其中很多序列化为XML和JSON)。 – 2015-12-29 22:57:38

-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; 
} 
2

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

设置时间跨度到30分钟

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

该解决方案为我工作。我使用.Net框架4.0的MVC 4.0。

4

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

{"PassedTimeSpan":"P1DT2H3M4S"} 

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

所以看起来格式是:

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

其中:

- 表示负入库时间,省略了对正值
p必须是第一个字符(除非负时间值)
T必须先于吨时间的一部分。如果0

+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] ==未定义? “”:timeArray [2]; var min =“00”+ m; var minute = min.substr(min.length - 2,2); 返回小时+“:”+分钟; } – LoBo 2015-06-03 08:56:26

+2

这是一个ISO 8601持续时间:https://en.wikipedia.org/wiki/ISO_8601#Durations – MikeJansen 2015-09-22 14:40:08

1

这些答案都是过时可以省略
[] =可选的一部分,所以我想我会提供更新更好的答案。 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