2012-06-08 45 views
6

Tengo un json que tiene la fecha como 2012-06-07T00:29:47.000 y tiene que ser deserializado. Pero en DataContractJsonSerializer análisis iso 8601 fecha

DataContractJsonSerializer serializer = new DataContractJsonSerializer(type); 
return (object)serializer.ReadObject(Util.GetMemoryStreamFromString(json)); 

llego a continuación excepción

There was an error deserializing the object of type System.Collections.Generic.List`1 
[[MyNameSpace.MyClass, MyNameSpace, Version=1.0.4541.23433, Culture=neutral, PublicKeyToken=null]]. 
DateTime content '2012-06-07T00:29:47.000' does not start with '\/Date(' and end with ')\/' as required for JSON 

Se está trabajando en Windows Mobile 7 pero el mismo código no funciona en Windows 8.
Se espera que el formato de fecha en lugar \/Date(1337020200000+0530)\/ de 2012-06-07T00:29:47.000.

¿Requiere serialización personalizada si es así, cómo? Y no puedo usar JSON.NET Estoy obligado a usar DataContractJsonSerializer y no puedo cambiar el formato de JSON ya que se usa el mismo JSON para Android.
Soy nuevo en .net. Gracias.

Respuesta

7

Utilice una propiedad de serie para la serialización/deserialización, y una propiedad separada, no serializada que la convierta en DateTime. Más fácil de ver algunos ejemplos de código:

[DataContract] 
public class LibraryBook 
{ 
    [DataMember(Name = "ReturnDate")] 
    // This can be private because it's only ever accessed by the serialiser. 
    private string FormattedReturnDate { get; set; } 

    // This attribute prevents the ReturnDate property from being serialised. 
    [IgnoreDataMember] 
    // This property is used by your code. 
    public DateTime ReturnDate 
    { 
     // Replace "o" with whichever DateTime format specifier you need. 
     // "o" gives you a round-trippable format which is ISO-8601-compatible. 
     get { return DateTime.ParseExact(FormattedReturnDate, "o", CultureInfo.InvariantCulture); } 
     set { FormattedReturnDate = value.ToString("o"); } 
    } 
} 

Usted podría hacer el análisis en la incubadora de FormattedReturnDate lugar, para permitir que falle antes si se recibe una mala cita.


vez haya incluido en GôTô 's sugerencia para dar el serializado DataMember el nombre correcto.

+0

¿Cuál es el formateador de fecha para '2012-06-07T00: 29: 47.000' He creado este' yyyy '-' MM '-' dd'T'HH ':' mm ':' ss' pero don ' t sabe qué hacer con '.000' –

+1

@InderKumarRathore Puede usar' f', por ejemplo 'yyyy '-' MM '-' dd'T'HH ':' mm ':' ss '.' fff'. Pero el [especificador de formato estándar] (http://msdn.microsoft.com/en-us/library/az4se3k1.aspx) de 'o' es [bastante cercano a eso ya] (http://msdn.microsoft.com /en-us/library/az4se3k1.aspx#Roundtrip), aunque incluirá un huso horario si DateTime.Kind es 'Utc' o' Local'. – shambulator

+0

gracias por su sugerencia de que está funcionando. :) –

Cuestiones relacionadas