2012-06-08 15 views
6

Ich habe eine JSON, die als 2012-06-07T00:29:47.000 Datum hat und deserialisiert werden muss. Aber aufDataContractJsonSerializer Parsing ISO 8601 Datum

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

I unten Ausnahme erhalten

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 

Es wird in Windows Mobile 7 arbeiten, aber der gleiche Code funktioniert nicht in Windows 8.
Es wird das Datumsformat als \/Date(1337020200000+0530)\/ erwartet statt von 2012-06-07T00:29:47.000.

Benötigt es benutzerdefinierte Serialisierung wenn ja dann wie? Und ich kann JSON.NET nicht verwenden Ich bin verpflichtet, DataContractJsonSerializer zu verwenden, und ich kann das Format des JSON nicht ändern, da das gleiche JSON für Android verwendet wird.
Ich bin neu in .net. Danke.

Antwort

7

Verwenden Sie eine Zeichenfolgeneigenschaft für die Serialisierung/Deserialisierung und eine separate, nicht serialisierte Eigenschaft, die sie in eine DateTime konvertiert.

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

Sie tun könnten, die Analyse in der Setter von FormattedReturnDate statt, es zu erlauben, früher zu scheitern, wenn ein schlechter Zeitpunkt empfangen wird: Leichtere einige Beispiel-Code zu sehen.


Edited GôTô ‚s Vorschlag, schließen die serialisierten Datamember den richtigen Namen zu geben.

+0

Was ist der Datumsformatierer für '2012-06-07T00: 29: 47.000' Ich habe dieses' yyyy 'erstellt -' MM '-' dd'T'HH ':' mm ':' ss 'aber nicht' t wissen, was mit '.000' zu tun ist –

+1

@InderKumarRathore Sie können' f' verwenden, zB 'jjjj '-' MM '-' dd'T'HH ':' mm ':' ss '.' fff '. Aber der [Standard Format Specifier] (http://msdn.microsoft.com/en-us/library/az4se3k1.aspx) von 'o' ist [ziemlich nah daran] (http://msdn.microsoft.com) /en-us/library/az4se3k1.aspx#Roundtrip), obwohl es eine Zeitzone enthält, wenn DateTime.Kind 'Utc' oder' Local' ist. – shambulator

+0

danke für deinen Vorschlag, es funktioniert. :) –