2016-08-22 64 views
1

我正在嘗試編寫一個通用模式來反序列化我的json數組字符串。 我有以下對象波紋管創建:通用模式:無法反序列化JSON數組

public interface IDataResponse<T> where T: class 
{ 
    List<T> Data { get; set; } 
} 

public class DataResponse<T>: IDataResponse<T> where T: class 
{ 
    [JsonProperty("value")] 
    public List<T> Data { get; set; } 
} 

我的JSON格式

{ 
    "values":{ 
    "value":[ 
    { 
     "value_1":"aaaaaa", 
     "value_2":"aaaaaa", 
     "value_3":"aaaaaa" 
    }, 
    { 
     "value_1":"bbbbbb", 
     "value_2":"bbbbbb", 
     "value_3":"bbbbbb" 
    } 
    ] 
    } 
} 

現在我可以使用這個圖案像

var myData = JsonConvert.DeserializeObject<List<DataResponse<MyData>>>(result); 

其中結果被JSON數組串。

但是ruuning此代碼,我得到了例外波紋管

無法反序列化JSON陣列(例如[1,2,3])轉換成類型「」,因爲類型需要JSON對象(例如{「名」 :「value」})來正確地反序列化

cani如何解決這個錯誤?

回答

2

我不確定要很好理解,但是,您是否錯過了列表的父容器?

我分享你的代碼desrialize數據

namespace ConsoleApplication1 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      string result = @" 
{ 
    'values':{ 
    'value':[ 
    { 
     'value_1':'aaaaaa', 
     'value_2':'aaaaaa', 
     'value_3':'aaaaaa' 
    }, 
    { 
     'value_1':'bbbbbb', 
     'value_2':'bbbbbb', 
     'value_3':'bbbbbb' 
    } 
    ] 
    } 
}"; 

      var myData = JsonConvert.DeserializeObject<MyContent<MyData>>(result); 
     } 
    } 

    public class MyContent<T> where T : class 
    { 

     [JsonProperty("values")] 
     public DataResponse<T> Values { get; set; } 
    } 

    [Serializable] 
    public class MyData 
    { 
     public string value_1 { get; set; } 
     public string value_2 { get; set; } 
     public string value_3 { get; set; } 
    } 

    public interface IDataResponse<T> where T : class 
    { 
     List<T> Data { get; set; } 
    } 

    public class DataResponse<T> : IDataResponse<T> where T : class 
    { 
     [JsonProperty("value")] 
     public List<T> Data { get; set; } 
    } 
} 
0

的錯誤信息表明有您的json數據values部分沒有匹配的類。你需要改變你的json的結構,否則你會得再添(根)類:

public class DataRoot<T> where T : class 
{ 
    public DataResponse<T> Values { get; set;} 
} 

public interface IDataResponse<T> where T : class 
{ 
    List<T> Data { get; set; } 
} 

public class DataResponse<T> : IDataResponse<T> where T : class 
{ 
    [JsonProperty("value")] 
    public List<T> Data { get; set; } 
} 

然後你就可以得到這樣的數據:

var myData = JsonConvert.DeserializeObject<DataRoot<MyData>>(result).Values; 
+0

myData的爲空。 – Jmocke