2010-07-12 20 views
9

Sto cercando di deserializzare/serializzare un periodo,Utilizzando JSON per serializzare/Deserialize TimeSpan

ma quando il JSON è inviare è impostato su 00:00:00 è presente anche possibile fare?

Grazie! -Kevin

Btw, il linguaggio è C#, utilizzando Visual Studio 2008.

+1

Quale Serializer si utilizza? JavaScriptSerializer?DataContractJsonSerializer? Potresti pubblicare un piccolo esempio di codice che non funziona? – Oleg

+0

Io uso Newtonsoft.json.jsonconvert. Quindi quello che faccio è. JsonConvert.SerializeObject (TimeSpan); – Kevin

risposta

4

ho capito, a quanto pare si tratta di un difetto di progettazione MS ...

Dal TimeSpan non può essere un oggetto senza parametri . XML non può ricrearlo.

Dai un'occhiata a questo sito. http://forums.silverlight.net/forums/p/51793/135450.aspx

Così. Pertanto, TimeSpan non può essere convertito. Un modo semplice per farlo è per modificare l'intervallo di tempo in una stringa, quindi inviare la stringa. e utilizzare TimeSpan.TryParse (String);

+6

Cosa c'entra XML con la tua domanda? – Crisfole

+0

@Crisfole Penso che al posto di "XML", si riferisca a qualsiasi serializzatore che sta usando (molti di questi serializzano su XML e 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

Se si applica il formato esatto, è possibile utilizzare un TimeSpan. Il formato è: "0.00: 00: 00.0000"

Impostare un periodo di 30 minuti

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

questa soluzione funziona per me. Sto usando MVC 4.0 con .Net framework 4.0.

4

Ho provato il metodo di # Jessycormier e non ha funzionato per me. Ho eseguito DataContractJsonSerializer per vedere cosa avrebbe generato e ho scoperto che mi dava un valore che assomigliava più a questo.

{"PassedTimeSpan":"P1DT2H3M4S"} 

Il valore indicato sopra era per 1 giorno, 2 ore, 3 minuti e 4 secondi.

modo che appaia come formato è:

[-] P [{giorni} D] [T [{ore} H] [{min} M] [{sec} S]]

Dove:

- Indica periodo negativo, omessa per valori positivi
P deve essere il primo carattere (salvo valore tempo negativo)
T deve precedere il t parte del tempo.
[] = parte opzionale che può essere omesso se 0.

+0

Grazie per aver scritto il modello generico! Sulla base di questo, potrei scrivere la prossima funzione: 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] == undefined? "": timeArray [2]; var min = "00" + m; var minute = min.substr (min.length - 2, 2); ora di ritorno + ":" + minuto; } – LoBo

+2

È una durata ISO 8601: https://en.wikipedia.org/wiki/ISO_8601#Durations – MikeJansen

1

Queste risposte sono tutte superate, così ho pensato di fornire una risposta migliore aggiornata. moment.js ora supporta direttamente il formato di serializzazione .NET Timespan.

A partire dalla versione 2.1.0, questo è supportato:

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