2010-07-12 33 views
9

Tôi đang cố gắng để deserialize/serialize một khoảng thời gian,Sử dụng JSON để serialize/deserialize TimeSpan

nhưng khi json là gửi nó thiết lập để 0:00:00 là này thậm chí có thể làm gì?

Cảm ơn! -Kevin

Btw, Ngôn ngữ là C#, sử dụng Visual Studio 2008.

+1

nào serializer bạn sử dụng không? JavaScriptSerializer?DataContractJsonSerializer? Bạn có thể đăng một ví dụ mã nhỏ không hoạt động? – Oleg

+0

Tôi sử dụng Newtonsoft.json.jsonconvert. Vì vậy, những gì tôi làm là. JsonConvert.SerializeObject (TimeSpan); – Kevin

Trả lời

4

I figured it out, Rõ ràng đó là một lỗ hổng MS thiết kế ...

Kể từ TimeSpan có thể không phải là một đối tượng parameterless . XML không thể tạo lại nó.

Hãy xem trang web này. http://forums.silverlight.net/forums/p/51793/135450.aspx

So. Do đó không thể chuyển đổi TimeSpan. Cách dễ dàng để thực hiện việc này là để thay đổi khoảng thời gian thành chuỗi và sau đó gửi chuỗi qua. và sử dụng TimeSpan.TryParse (String);

+6

XML phải làm gì với câu hỏi của bạn? – Crisfole

+0

@Crisfole Tôi nghĩ thay vì "XML", anh ta đề cập đến bất kỳ serializer nào anh ta đang sử dụng (rất nhiều serialize cho cả XML và JSON). –

-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

Nếu bạn áp dụng định dạng chính xác, bạn có thể sử dụng một TimeSpan. Định dạng là: "0.00: 00: 00,0000"

Thiết lập một TimeSpan đến 30 phút

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

Giải pháp này làm việc cho tôi. Tôi đang sử dụng MVC 4.0 với .Net framework 4.0.

4

Tôi đã thử phương pháp # Jessycormier và nó không hiệu quả đối với tôi. Tôi chạy DataContractJsonSerializer để xem những gì nó sẽ tạo ra và tôi thấy rằng đã cho tôi một giá trị trông giống như thế này.

{"PassedTimeSpan":"P1DT2H3M4S"} 

Giá trị được hiển thị ở trên là trong 1 ngày, 2 giờ, 3 phút và 4 giây.

Vì vậy, nó trông giống như định dạng là:

[-] P [{ngày} D] [T [{hours} H] [{min} M] [{sec} S]]

đâu:

- Chỉ ra khoảng thời gian tiêu cực, bỏ qua cho các giá trị tích cực
P phải là ký tự đầu tiên (trừ khi giá trị thời gian âm)
T phải đặt trước t phần ime của khoảng thời gian.
[] = tùy chọn phần đó có thể được bỏ qua nếu 0.

+0

Cảm ơn bạn đã viết ra mẫu chung! Dựa trên điều này, tôi có thể viết hàm tiếp theo: formatTime = function (jsonTime) { var re =/-? P (?: \ D + D)? (?: T (?: (\ D +) H)? ((\ d +) M)? ((\ d +) S)?)? /; var timeArray = re.exec (jsonTime); var h = timeArray [1] == không xác định? "": timeArray [1]; var hr = "00" + h; var hour = hr.substr (hr.length - 2, 2); var m = timeArray [2] == không xác định? "": timeArray [2]; var min = "00" + m; var phút = min.substr (min.length - 2, 2); giờ trở lại + ":" + phút; } – LoBo

+2

Đó là thời hạn ISO 8601: https://en.wikipedia.org/wiki/ISO_8601#Durations – MikeJansen

1

Những câu trả lời đều là lỗi thời, vì vậy tôi nghĩ tôi sẽ cung cấp một câu trả lời được cập nhật tốt hơn. moment.js hiện hỗ trợ trực tiếp định dạng tuần tự .NET Timespan.

Tính đến phiên bản 2.1.0, đây được hỗ trợ:

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 
Các vấn đề liên quan