2010-07-12 9 views
9

Je suis en train de désérialisation/sérialisation un timespan,Utilisation de JSON pour linéariser/Deserialize TimeSpan

mais quand le JSON est l'envoyer est mis 00:00:00 est-ce encore possible de le faire?

Merci! -Kevin

BTW, la langue est C#, en utilisant Visual Studio 2008.

+1

qui vous sérialiseur utiliser? JavaScriptSerializer?DataContractJsonSerializer? Pourriez-vous poster un petit exemple de code qui ne fonctionne pas? – Oleg

+0

J'utilise Newtonsoft.json.jsonconvert. Donc ce que je fais est. JsonConvert.SerializeObject (TimeSpan); – Kevin

Répondre

4

j'ai tout compris, apparemment il est un défaut de conception de MS ...

Depuis TimeSpan ne peut pas être un objet parameterless . XML ne peut pas le recréer.

Jetez un coup d'oeil sur ce site. http://forums.silverlight.net/forums/p/51793/135450.aspx

Donc. Par conséquent, TimeSpan ne peut pas être converti. Une manière simple de faire ceci est pour changer le timespan dans une chaîne, et puis renvoyez la chaîne. et utilisez TimeSpan.TryParse (String);

+6

Qu'est-ce que XML a à voir avec votre question? – Crisfole

+0

@Crisfole Je pense qu'au lieu de "XML", il fait référence à n'importe quel sérialiseur qu'il utilise (beaucoup d'entre eux se sérialisent à la fois en XML et en 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

Si vous appliquez le format exact, vous pouvez utiliser un TimeSpan. Le format est le suivant: "0.00: 00: 00,0000"

Définition d'un TimeSpan à 30 minutes

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

Cette solution fonctionne pour moi. J'utilise MVC 4.0 avec .Net framework 4.0.

4

J'ai essayé la méthode de # Jessycormier et cela n'a pas fonctionné pour moi. J'ai exécuté DataContractJsonSerializer pour voir ce qu'il générerait et j'ai trouvé que cela me donnait une valeur qui ressemblait plus à ceci.

{"PassedTimeSpan":"P1DT2H3M4S"} 

La valeur ci-dessus était pour 1 jour, 2 heures, 3 minutes, et 4 secondes.

Il semble donc que le format est:

[-] P [{jours} D] [T [{heures} H] [{min} M] [{s} S]]

Où:

- Indique timespan négatif, omis pour les valeurs positives
P doit être le premier caractère (à moins que la valeur du temps négatif)
T doit précéder la t ime partie de la période.
[] = partie facultative qui peut être omise si 0.

+0

Merci d'avoir écrit le modèle générique! Sur cette base, je pourrais écrire la fonction suivante: formatTime = function (jsonTime) { var re =/-? P (?: \ D + D)? (?: T (?: (D +) H)? ((\ d +) M)? ((\ d +) S)?)? /; var timeArray = re.exec (jsonTime); var h = timeArray [1] == non défini? "": timeArray [1]; var hr = "00" + h; var hour = hr.substr (hr.length - 2, 2); var m = timeArray [2] == non défini? "": timeArray [2]; var min = "00" + m; var minute = min.substr (min.length - 2, 2); heure de retour + ":" + minute; } – LoBo

+2

C'est une durée ISO 8601: https://en.wikipedia.org/wiki/ISO_8601#Durations – MikeJansen

1

Ces réponses sont pas à jour, donc je pensais que je fournirais une meilleure mise à jour de réponse. moment.js prend désormais directement en charge le format de sérialisation .NET Timespan.

de la version 2.1.0, cela est pris en charge:

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