C#Json反序列化失败

时间:2014-12-28 11:18:28

标签: c# arrays json serialization

我正在尝试创建一个可以通过JSON rest api C#显示本地电视指南的应用程序,但是在我的Json响应的反序列化方面存在一些问题。

在我的json调用中,我现在只在数组中使用,而且我不拥有api服务。

我收到此错误消息:

  

Newtonsoft.Json.DLL中出现“Newtonsoft.Json.JsonSerializationException”类型的异常,但未在用户代码中处理

     

附加信息:无法将当前JSON对象(例如{“name”:“value”})反序列化为类型'System.Collections.Generic.List`1 [TDC_Play_TV_Mobil.superclass2 + Now]',因为该类型需要JSON数组(例如[1,2,3])正确反序列化。

     

要修复此错误,请将JSON更改为JSON数组(例如[1,2,3])或更改反序列化类型,使其成为普通的.NET类型(例如,不是像整数这样的基本类型,而不是可以从JSON对象反序列化的集合类型,如数组或List)。 JsonObjectAttribute也可以添加到类型中以强制它从JSON对象反序列化。

     

路径'现在',第1行,第7位。

我的功能:

private HttpClient client;

   public async Task<List<superclass2.Now>> GetComments()
   {
       client = new HttpClient();
      var response = await client.GetAsync(new Uri("http://api.yousee.tv/rest/tvguide/nowandnext/"));
       if (response.IsSuccessStatusCode)
       {

           string json = await response.Content.ReadAsStringAsync();

           System.Diagnostics.Debug.WriteLine(json);
           var task = Task.Factory.StartNew(() => JsonConvert.DeserializeObject<List<superclass2.Now>>(json));

           var value = await task;
         //  List<superclass2.Now> comments = Newtonsoft.Json.JsonConvert.DeserializeObject<List<superclass2.Now>>(await json);
          System.Diagnostics.Debug.WriteLine("Comments er lavet");
          return value;

       }
       else
       {
           throw new Exception("Errorhandling message");

       }


   }

我的班级档案:

public class superclass2
{
public class Logos
   {
       public string small { get; set; }
       public string large { get; set; }
       public string small_seapp { get; set; }
       public string large_seapp { get; set; }
       public string extralarge { get; set; }
       public string super { get; set; }
       public string mega { get; set; }
       public string netgem { get; set; }
       public string svg { get; set; }
   }

   public class ChannelInfo
   {
       public string name { get; set; }
       public string shortname { get; set; }
       public string logo_image_prefix { get; set; }
       public Logos logos { get; set; }
       public int archivedays { get; set; }
       public string channelcolor { get; set; }
   }

   public class FormattedDate
   {
       public string time_begin { get; set; }
       public string time_end { get; set; }
       public string date { get; set; }
   }

   public class ImagesSixteenbynine
   {
       public string large { get; set; }
       public string medium { get; set; }
       public string small { get; set; }
   }

   public class ImagesFourbythree
   {
       public string large { get; set; }
       public string small { get; set; }
   }

   public class ImagesSquare
   {
       public string large { get; set; }
       public string medium { get; set; }
       public string small { get; set; }
   }

   public class Now
   {
       public int id { get; set; }
       public int dvb_id { get; set; }
       public int channel { get; set; }
       public ChannelInfo channel_info { get; set; }
       public string orgtitle { get; set; }
       public string cast { get; set; }
       public string directors { get; set; }
       public string series_info { get; set; }
       public int series_id { get; set; }
       public string series_name { get; set; }
       public bool allowseriesrecording { get; set; }
       public int totalinarchive { get; set; }
       public int popularity_score { get; set; }
       public int totalupcoming { get; set; }
       public int category { get; set; }
       public int subcategory { get; set; }
       public string category_string { get; set; }
       public string subcategory_string { get; set; }
       public int begin { get; set; }
       public object actual_begin { get; set; }
       public int end { get; set; }
       public int actual_end { get; set; }
       public int tvdate { get; set; }
       public FormattedDate formatted_date { get; set; }
       public string title { get; set; }
       public string description { get; set; }
       public bool archive { get; set; }
       public bool scrubbingallowed { get; set; }
       public int expiresfromarchive { get; set; }
       public bool startover { get; set; }
       public string imageprefix { get; set; }
       public ImagesSixteenbynine images_sixteenbynine { get; set; }
       public ImagesFourbythree images_fourbythree { get; set; }
       public ImagesSquare images_square { get; set; }
       public List<object> decorations { get; set; }
   }

   public class Logos2
   {
       public string small { get; set; }
       public string large { get; set; }
       public string small_seapp { get; set; }
       public string large_seapp { get; set; }
       public string extralarge { get; set; }
       public string super { get; set; }
       public string mega { get; set; }
       public string netgem { get; set; }
       public string svg { get; set; }
   }

   public class ChannelInfo2
   {
       public string name { get; set; }
       public string shortname { get; set; }
       public string logo_image_prefix { get; set; }
       public Logos2 logos { get; set; }
       public int archivedays { get; set; }
       public string channelcolor { get; set; }
   }

   public class FormattedDate2
   {
       public string time_begin { get; set; }
       public string time_end { get; set; }
       public string date { get; set; }
   }

   public class ImagesSixteenbynine2
   {
       public string large { get; set; }
       public string medium { get; set; }
       public string small { get; set; }
   }

   public class ImagesFourbythree2
   {
       public string large { get; set; }
       public string small { get; set; }
   }

   public class ImagesSquare2
   {
       public string large { get; set; }
       public string medium { get; set; }
       public string small { get; set; }
   }

   public class Next
   {
       public int id { get; set; }
       public int dvb_id { get; set; }
       public int channel { get; set; }
       public ChannelInfo2 channel_info { get; set; }
       public string orgtitle { get; set; }
       public string cast { get; set; }
       public string directors { get; set; }
       public string series_info { get; set; }
       public int series_id { get; set; }
       public string series_name { get; set; }
       public bool allowseriesrecording { get; set; }
       public int totalinarchive { get; set; }
       public int popularity_score { get; set; }
       public int totalupcoming { get; set; }
       public int category { get; set; }
       public int subcategory { get; set; }
       public string category_string { get; set; }
       public string subcategory_string { get; set; }
       public int begin { get; set; }
       public int actual_begin { get; set; }
       public int end { get; set; }
       public int actual_end { get; set; }
       public int tvdate { get; set; }
       public FormattedDate2 formatted_date { get; set; }
       public string title { get; set; }
       public string description { get; set; }
       public bool archive { get; set; }
       public bool scrubbingallowed { get; set; }
       public int expiresfromarchive { get; set; }
       public bool startover { get; set; }
       public string imageprefix { get; set; }
       public ImagesSixteenbynine2 images_sixteenbynine { get; set; }
       public ImagesFourbythree2 images_fourbythree { get; set; }
       public ImagesSquare2 images_square { get; set; }
       public List<object> decorations { get; set; }
   }

   public class RootObject
   {
       public List<Now> now { get; set; }
       public List<Next> next { get; set; }
   }

}

1 个答案:

答案 0 :(得分:0)

您的JSON不是List<superclass2.Now>,而是superclass2.RootObject。所以你需要做一些事情:

    public async Task<List<superclass2.Now>> GetComments()    
    {
        client = new HttpClient();
        var response = await client.GetAsync(new Uri("http://api.yousee.tv/rest/tvguide/nowandnext/"));
        if (response.IsSuccessStatusCode)
        {
            string json = await response.Content.ReadAsStringAsync();
            System.Diagnostics.Debug.WriteLine(json);
            var task = Task.Factory.StartNew(() => JsonConvert.DeserializeObject<superclass2.RootObject>(json));

            var value = await task;
            System.Diagnostics.Debug.WriteLine("Comments er lavet");
            return (value == null ? null : value.now);
        }
        else
        {
            throw new Exception("Errorhandling message");
        }
    }

同意Jon Skeet,消除类的嵌套会更好,纯粹是为了提高可读性。如果您需要这些类仅存在于特定范围内,则最好使用nested namespaces。但是,他们并没有造成你的错误。