2010-07-12 37 views
9

Estoy tratando de deserializar/serializar un lapso de tiempo,Utilizando JSON serializar/Deserialize TimeSpan

pero cuando el JSON se enviará que está establecido en 00:00:00 es esto posible hacer?

Gracias! -Kevin

Por cierto, el lenguaje es C#, utilizando Visual Studio 2008.

+1

Qué SERIALIZER utiliza? ¿JavaScriptSerializer?DataContractJsonSerializer? ¿Podría publicar un pequeño ejemplo de código que no funciona? – Oleg

+0

Uso Newtonsoft.json.jsonconvert. Entonces lo que hago es. JsonConvert.SerializeObject (TimeSpan); – Kevin

Respuesta

4

lo he descubierto, al parecer se trata de un defecto de diseño MS ...

Desde TimeSpan no puede ser un objeto sin parámetros . XML no puede recrearlo.

Eche un vistazo a este sitio web. http://forums.silverlight.net/forums/p/51793/135450.aspx

So. Por lo tanto, TimeSpan no se puede convertir. Una forma fácil de hacerlo es para cambiar el intervalo de tiempo en una cadena, y luego enviar la cadena. y usa TimeSpan.TryParse (String);

+6

¿Qué tiene que ver XML con su pregunta? – Crisfole

+0

@Crisfole Creo que en lugar de "XML", se refiere al serializador que está utilizando (muchos de ellos se serializan tanto en XML como 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 aplica el formato exacto, puede utilizar un TimeSpan. El formato es: "0.00: 00: 00.0000"

Configuración de un intervalo de tiempo de 30 minutos

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

Esta solución funciona para mí. Estoy usando MVC 4.0 con .Net framework 4.0.

4

Probé el método de # Jessycormier y no funcionó para mí. Ejecuté DataContractJsonSerializer para ver qué generaría y descubrí que eso me dio un valor que se parecía más a esto.

{"PassedTimeSpan":"P1DT2H3M4S"} 

El valor que se muestra arriba fue para 1 día, 2 horas, 3 minutos y 4 segundos.

lo que parece que el formato es:

[-] P [{día} D] [T [{hora} H] [{min} M] [{sec} S]]

Dónde:

- Indica lapso de tiempo negativo, se omite para los valores positivos
P debe ser el primer carácter (a menos valor temporal negativo)
T debe preceder a la t porción del tiempo.
[] = parte opcional que se puede omitir si 0.

+0

¡Gracias por escribir la plantilla genérica! Basado en esto, podría escribir la siguiente función: 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); hora de retorno + ":" + minuto; } – LoBo

+2

Tiene una duración ISO 8601: https://en.wikipedia.org/wiki/ISO_8601#Durations – MikeJansen

1

Estas respuestas están obsoletos, por lo que pensé que iba a dar una mejor respuesta actualizada. moment.js ahora es directamente compatible con .NET Timespan formato de serialización.

partir de la versión 2.1.0, ello con el respaldo:

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