【问题标题】:Generic Pattern: Cannot deserialize the JSON array通用模式:无法反序列化 JSON 数组
【发布时间】:2016-08-22 14:22:48
【问题描述】:

我正在尝试编写一个通用模式来反序列化我的 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);

其中 result 是 json 数组字符串。

但是运行这段代码,我得到了下面的异常

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

如何解决这个错误?

【问题讨论】:

    标签: c# arrays json generics serialization


    【解决方案1】:

    我不太清楚,但是,你没有错过你列表的父容器吗?

    我分享一个反序列化数据的代码

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

    【讨论】:

      【解决方案2】:

      错误消息表明您的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;
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多