2011-11-20 21 views
12

Jestem pewien, że to pytanie było zadawane w kółko, ale z jakiegoś powodu wciąż nie mogę tego zrobić.Deserializowanie prostej macierzy JSON za pomocą DataContractJsonSerializer

Chcę deserializować obiekt JSON zawierający pojedynczy element członkowski; tablicę ciągów:

{"results" : ["a", "b"]} 

Jest to klasa, która próbuję deserializowania do:

public class Whatever { 
    [DataMember(Name = "results")] 
    public string[] Results { get; protected set; } 
} 

I to jest metoda Cofnięcie:

private static T Deserialize<T>(string json) 
{ 
    var instance = Activator.CreateInstance<T>(); 
    using (var ms = new MemoryStream(Encoding.Unicode.GetBytes(json))) 
    { 
     var serializer = new DataContractJsonSerializer(instance.GetType()); 
     return (T)serializer.ReadObject(ms); 
    } 
} 

Rozmowa jest jak Deserialize<Whatever>("{\"results\" : [\"a\", \"b\"]}") zwracając zainicjowaną instancję o numerze Whatever, ale tablica Results pozostaje w stanie null.

Czy coś jest nie tak ze strukturą Whatever?

+11

Nie musisz 'instancji var = Activator.CreateInstance ();' 'używać typeof (T)' –

Odpowiedz

12

Ach, po zaksięgowaniu to zdałem sobie sprawę, że brakowało mi dekorację atrybutu DataContract na Whatever:

[DataContract] 
public class Whatever { 
    [DataMember(Name = "results")] 
    public string[] Results { get; protected set; } 
} 

Teraz działa dobrze.

+6

Dzięki. Istotne jest również odwzorowywanie nazw elementów danych na wielkość liter. Zrobiłeś to, jednak chcę to podkreślić, na wypadek gdyby ktoś próbował użyć DataContract i DataMember, ale zapomniał o atrybucie Name (tak jak zrobiłem to po raz pierwszy). – cudahead

+1

Jesteś niesamowity !! –

8

Wiem, że stanowisko jest dość przedawnione; ale: możliwe jest również bezpośrednie zwrócenie listy obiektów klasy, jeśli masz ciąg informacji jsonarray, aby powiązać z dataclass; tj .:

List<SomeDataClass> filesToMove = new List<SomeDataClass>(); 

public T deserializeJSON<T>(string json) 
{ 
    var instance = typeof(T); 
    var lst = new List<SomeDataClass>(); 

    using (var ms = new MemoryStream(Encoding.Unicode.GetBytes(json))) 
    { 
     var deserializer = new DataContractJsonSerializer(instance); 
     return (T)deserializer.ReadObject(ms); 
    } 
} 

someJsonArrayString = "[{\"ID\":7},{\"ID\":16}]"; 
filesToMove = deserializeJSON<List<SomeDataClass>>(someJsonArrayString); 
Console.WriteLine(filesToMove[1].ID); // returns 16 

z dataclass SomeDataClass.cs:

[DataContract] 
class SomeDataClass 
{ 
    [DataMember] 
    public int ID { get; set; }   
} 
+0

Co z listą, twój przykład nie działa tak, jak to opublikowałeś. – Sebastian

Powiązane problemy