2011-11-20 89 views
12

我確信這個問題一直被反覆詢問,但由於某種原因,我仍然無法設法讓這個工作。使用DataContractJsonSerializer反序列化一個簡單的JSON數組

我想反序列化包含單個成員的JSON對象;一個字符串數組:

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

這是我嘗試反序列化到類:

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

這是反序列化方法:

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

Deserialize<Whatever>("{\"results\" : [\"a\", \"b\"]}")呼叫是返回Whatever的初始化實例,但Results陣列停留null

Whatever的結構是否有問題?

+11

你不需要'VAR實例= Activator.CreateInstance ();'用'的typeof(T)' –

回答

12

啊,這張貼後,我意識到,我是缺少DataContract屬性裝飾上Whatever

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

現在它工作正常。

+6

謝謝。映射數據成員的名稱區分大小寫也是至關重要的。你已經這樣做了,但是我想強調一下,以防有人試圖使用DataContract和DataMember,但忘記了Name屬性(就像我第一次做的那樣)。 – cudahead

+1

你真棒! –

8

我知道,帖子是相當禁止的;但是: 也可以直接返回一個類對象列表,如果你有一個jsonarray字符串的信息綁定到一個數據類;即:

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 

與數據類SomeDataClass.cs:

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

什麼與列表,你的例子不像你發佈它的工作。 – Sebastian

相關問題