2016-08-22 66 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