Search code examples
c#jsonimgur

Cannot deserialize the current JSON objectinto type 'System.Collections.Generic.List because the type requires a JSON arrayto deserialize correctly


I'm playing around with the Imgur API and having trouble deseralizing the JSON response. My JSON looks like this:

{
  "data":{
    "id":"zPBszkd",
    "title":null,
    "description":null,
    "datetime":1634033771,
    "type":"image\/png",
    "animated":false,
    "width":391,
    "height":149,
    "size":11093,
    "views":0,
    "bandwidth":0,
    "vote":null,
    "favorite":false,
    "nsfw":null,
    "section":null,
    "account_url":null,
    "account_id":0,
    "is_ad":false,
    "in_most_viral":false,
    "has_sound":false,
    "tags":[
      
    ],
    "ad_type":0,
    "ad_url":"",
    "edited":"0",
    "in_gallery":false,
    "deletehash":"EUqn23MqOTdDOov",
    "name":"",
    "link":"https:\/\/i.imgur.com\/zPBszkd.png"
  },
  "success":true,
  "status":200
}

But I'm unsure how to deseralize this using Newtonsoft. I've read a couple of guides and questions but still keep running into the same error of:

Cannot deserialize the current JSON object (e.g. {"name":"value"}) into type 'System.Collections.Generic.List`1[System.String]' because the type requires a JSON array (e.g. [1,2,3]) to deserialize correctly.

To fix this error either change the JSON to a JSON array (e.g. [1,2,3]) or change the deserialized type so that it is a normal .NET type (e.g. not a primitive type like integer, not a collection type like an array or List) that can be deserialized from a JSON object. JsonObjectAttribute can also be added to the type to force it to deserialize from a JSON object.

Would appreciate a code snippet that deseralizes this JSON correctly and an explanation of why it has to be done a certain way


Solution

  • If you are unsure about the correct class structure to deserialize a given JSON string into, you can make use of tools such as Json2CSharp or Visual Studios Paste Special feature which will generate the class structure for you:

    public class Data
    {
        public string id { get; set; }
        public object title { get; set; }
        public object description { get; set; }
        public int datetime { get; set; }
        public string type { get; set; }
        public bool animated { get; set; }
        public int width { get; set; }
        public int height { get; set; }
        public int size { get; set; }
        public int views { get; set; }
        public int bandwidth { get; set; }
        public object vote { get; set; }
        public bool favorite { get; set; }
        public object nsfw { get; set; }
        public object section { get; set; }
        public object account_url { get; set; }
        public int account_id { get; set; }
        public bool is_ad { get; set; }
        public bool in_most_viral { get; set; }
        public bool has_sound { get; set; }
        public List<object> tags { get; set; }
        public int ad_type { get; set; }
        public string ad_url { get; set; }
        public string edited { get; set; }
        public bool in_gallery { get; set; }
        public string deletehash { get; set; }
        public string name { get; set; }
        public string link { get; set; }
    }
    
    public class Root
    {
        public Data data { get; set; }
        public bool success { get; set; }
        public int status { get; set; }
    }
    

    With the correct class structure given you can now deserialize the JSON string into an object of your model:

    var result = JsonConvert.DeserializeObject<Root>(json);