通用模式:无法反序列化JSON数组

时间:2016-08-22 14:22:48

标签: c# arrays json generics serialization

我正在尝试编写一个通用模式来反序列化我的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数组字符串。

但是重新编写这段代码,我得到了例外

  

无法将JSON数组(例如[1,2,3])反序列化为类型''因为类型需要JSON对象(例如{“name”:“value”})才能正确反序列化

如何解决此错误?

2 个答案:

答案 0 :(得分:2)

我不太清楚,但是,你有没有错过你名单的父容器?

我与您分享了一个用于对数据进行反序列化的代码

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

答案 1 :(得分:0)

错误消息表明您的values数据的json部分没有匹配的类。您需要更改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;