2010-07-12 44 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