2012-06-08 14 views
6

Ho un JSON che ha data come 2012-06-07T00:29:47.000 e deve essere deserializzato. MaDataContractJsonSerializer parsing iso 8601 data

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

ottengo sotto eccezione

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 

Si sta lavorando in Windows Mobile 7 ma lo stesso codice non funziona in Windows 8.
Si aspetta formato della data come \/Date(1337020200000+0530)\/ invece di 2012-06-07T00:29:47.000.

Richiede serializzazione personalizzata se sì, quindi come? E non posso usare JSON.NET Sono obbligato a utilizzare DataContractJsonSerializer e non riesco a modificare il formato del JSON come lo stesso JSON utilizzato per Android.
Sono nuovo in .net. Grazie.

risposta

7

Utilizzare una proprietà stringa per la serializzazione/deserializzazione e una proprietà separata, non serializzata che la converte in un DateTime. Più facile vedere alcuni esempi di codice:

[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"); } 
    } 
} 

Si potrebbe fare il parsing del setter di FormattedReturnDate invece, per consentire il fallimento prima se si riceve una cattiva data.


modificato per includere GôTô 's suggerimento per dare il serializzato DataMember il nome giusto.

+0

Che cos'è il formattatore di date per "2012-06-07T00: 29: 47.000' Ho creato questo' yyyy '-' MM '-' dd'T'HH ':' mm ':' ss' ma don ' So cosa fare con '.000' –

+1

@InderKumarRathore È possibile utilizzare' f', ad es. 'Aaaa '-' MM '-' dd'T'HH ':' mm ':' ss fff'. '. Ma lo [specificatore di formato standard] (http://msdn.microsoft.com/en-us/library/az4se3k1.aspx) di 'o' è [abbastanza vicino a quello già] (http://msdn.microsoft.com /en-us/library/az4se3k1.aspx#Roundtrip), anche se includerà un fuso orario se DateTime.Kind è 'Utc' o' Local'. – shambulator

+0

grazie per il tuo suggerimento sta funzionando. :) –

Problemi correlati