2010-07-12 16 views
9

Ich versuche, eine Zeitspanne zu deserialisieren/serialisiert,mit JSON serialisieren/Deserialize Span

aber wenn die json es auf 00:00:00 ist dies überhaupt möglich zu machen gesetzt ist senden?

Danke! -Kevin

Btw, Sprache C# ist, Visual Studio 2008.

+1

, die Sie verwenden Serializer? JavaScriptSerializer?DataContractJsonSerializer? Könnten Sie ein kleines Codebeispiel posten, das nicht funktioniert? – Oleg

+0

Ich benutze Newtonsoft.json.jsonconvert. Also was ich tue ist. JsonConvert.SerializeObject (TimeSpan); – Kevin

Antwort

4

ich es herausgefunden verwenden, offenbar ein MS Design-Fehler, es ist ...

Da Span kann kein parameterlos Objekt sein . XML kann es nicht neu erstellen.

Werfen Sie einen Blick auf diese Website. http://forums.silverlight.net/forums/p/51793/135450.aspx

So. Daher kann TimeSpan nicht konvertiert werden. Eine einfache Möglichkeit, dies zu tun, ist , um die Zeitspanne in eine Zeichenfolge zu ändern und dann die Zeichenfolge zu senden. und verwenden Sie TimeSpan.TryParse (String);

+6

Was hat XML mit Ihrer Frage zu tun? – Crisfole

+0

@Crisfole Ich denke, anstelle von "XML" bezieht er sich auf jeden Serializer, den er verwendet (viele von ihnen serialisieren sowohl XML als auch 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

Wenn Sie das genaue Format anwenden, können Sie einen TimeSpan verwenden. Das Format ist: "0.00: 00: 00.0000"

eine Zeitspanne bis 30 Minuten einstellen

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

Diese Lösung funktioniert für mich. Ich verwende MVC 4.0 mit .Net Framework 4.0.

4

Ich versuchte # Jessycormier Methode und es hat nicht für mich funktioniert. Ich habe DataContractJsonSerializer ausgeführt, um zu sehen, was es erzeugen würde und ich fand, dass mir ein Wert gab, der eher so aussah.

{"PassedTimeSpan":"P1DT2H3M4S"} 

Der oben angezeigte Wert war für 1 Tag, 2 Stunden, 3 Minuten und 4 Sekunden.

So wie es aussieht Format ist:

[-] P [{days} D] [T [{Stunden} H] [{min} M] [{s} s]]

Wo:

- negativ Zeitspanne Zeigt, für positive Werte weggelassen
P muss das erste Zeichen sein (es sei denn negativen Zeitwert)
T die t vorausgehen muss ein Teil der Zeitspanne.
[] = optionaler Teil, kann entfallen, wenn 0.

+0

Danke für das Schreiben der generischen Vorlage! Auf dieser Basis könnte ich die nächste Funktion schreiben: formatTime = function (jsonTime) { var re =/-? P (?: \ D + D)? (?: T (?: (\ D +) H)? ((\ d +) M)? ((\ d +) S)?)? /; var ZeitArray = re.exec (jsonTime); var h = ZeitArray [1] == undefiniert? "": ZeitArray [1]; var hr = "00" + h; var hour = hrsr (hr. length - 2, 2); var m = ZeitArray [2] == undefiniert? "": ZeitArray [2]; var min = "00" + m; var minute = min.sub (min.length - 2, 2); Rückkehr Stunde + ":" + Minute; } – LoBo

+2

Es ist eine ISO 8601-Dauer: https://en.wikipedia.org/wiki/ISO_8601#Durations – MikeJansen

1

Diese Antworten alle veraltet sind, so dachte ich, ich würde eine aktualisierte bessere Antwort. moment.js unterstützt jetzt direkt .NET Timespan Serialisierungsformat.

Ab Version 2.1.0 wird diese unterstützt:

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