2012-07-09 81 views
3

我有以下幾點:讓JSON反序列化在泛型情況下工作?

public class BaseEntity<T> where T: class 
{ 
    public OperationStatus OperationStatus { set; get; } 
    public List<T> List { set; get; } 

    protected internal BaseEntity() 
    { 
     if (OperationStatus == null) 
     { 
      OperationStatus = new OperationStatus(); 
      OperationStatus.IsSuccess = true; 
     } 

     this.List = new List<T>(); 
    } 

    internal BaseEntity(IEnumerable<T> list) 
    { 
     if (OperationStatus == null) 
     { 
      OperationStatus = new OperationStatus(); 
      OperationStatus.IsSuccess = true; 
     } 

     this.List = new List<T>(); 
     foreach (T k in list) 
     { 
      this.List.Add(k); 
     } 
    } 

} 

public class KeyValuePair 
{ 
    public string key; 
    public string value; 
} 

public class KeyValuePairList : BaseEntity<KeyValuePair> 
{ 
    public KeyValuePairList() { } 
    public KeyValuePairList(IEnumerable<KeyValuePair> list) 
     : base(list) { } 
} 

// Multiple other classes like KeyValuePair but all have the 
// same behavior so they have been derived from BaseEntity 
在我的代碼

現在,我試圖JSON字符串映射到KeyValuePair列表的一個實例,我目前做如下:

result = 
@"{ 
    \"d\": { 
     \"OperationStatus\": { 
      \"IsSuccess\": true, 
      \"ErrorMessage\": null, 
      \"ErrorCode\": null, 
      \"InnerException\": null 
     }, 
     \"List\": [{ 
      \"key\": \"Key1\", 
      "\value\": \"Value1\" 
     }, { 
      \"key\": \"Key2\", 
      \"value\": \"Value2\" 
     }] 
    } 
}" 

嘗試#1

JavaScriptSerializer serializer = new JavaScriptSerializer(); 
KeyValuePairList output = serializer.Deserialize<KeyValuePairList>(result); 

不過,這並不會因爲012的構造工作沒有任何參數調用。如果我刪除該構造函數,則JSON序列化會失敗,並顯示錯誤No parameterless constructor found。我如何告訴KeyValuePairList在其調用中使用KeyValuePair作爲模板?或者,也許我該如何適應JSON序列化程序用於此目的?

嘗試#2

我試過JSON.net過,具體如下:

var oo = JsonConvert.DeserializeObject<KeyValuePairList>(result); 

如何使這項工作有什麼建議?

回答

2

其實解決方案比我想象的要簡單。問題是服務器正在返回帶有根節點d的JSON字符串。正因爲如此,反序列化失敗了,因爲它不知道如何處理根節點d。這可以解決如下:

第1步:添加其他類JSONWrapper一個包裝傳入的JSON字符串:

public class JSONWrapper<T> where T:class 
{ 
    public T d {set; get;} 
} 

第2步:使用這個新的類,而不是

JavaScriptSerializer serializer = new JavaScriptSerializer(); 
var oo = serializer.Deserialize<JsonWrapper<KeyValuePairList>>(result); 
反序列化

更符合我的整體邏輯,所以我不必做任何重大更改。感謝所有幫助我度過寶貴時間的人。

+0

好的,你的問題,你的解決方案。但是對於我來說,對於一個簡單的json進行反序列化來說代碼太多了。 – 2012-07-09 20:16:52

0

嘗試的T[]代替List<T>

你應該有兩個屬性,

public T[] Items{ 
    get{ 
     return ItemList.ToArray(); 
    } 
    set{ 
     ItemList.Clear(); 
     ItemList.AddRange(value); 
    } 
} 

[ScriptIgnore] 
public List<T> ItemList {get;set;} 

項目作爲陣列將在JSON序列化,你可以使用ITEMLIST您的其他業務。

+0

謝謝。更清晰一些會更好。因爲我以前使用過'List',所以我可以使用列表中的'Add'方法。這種修改將打破現有的代碼(我將元素添加到列表中的構造函數內的部分)。任何解決方法? – Legend 2012-07-09 19:31:09

+0

我已經添加了一個解決方法。 – 2012-07-10 05:16:30