Search code examples
c#jsonparsingwindows-phone-8

Parsing Json with Newtonsoft getting error


On a web service call i get the following response

   {
   "132800000000040": {
      "likes": 38347,
      "id": "132800000000040"
   },
   "192011111111130": {
      "likes": 44855,
      "id": "192011111111130"
   },
   "115372222222226": {
      "likes": 42227,
      "id": "115372222222226"
   },
   "186111111111116": {
      "likes": 21987,
      "id": "186111111111116"
   },
   "30000000002": {
      "likes": 18539,
      "id": "30000000002"
   },
   "24000000006": {
      "likes": 16438,
      "id": "24000000006"
   }
}

I created a class to hold data

public class LikeCount
{
    public string id { get; set; }
    public string likes { get; set; }
}

and tried to parse the json as follows

var responseString = await response.Content.ReadAsStringAsync();
dynamic obj = Newtonsoft.Json.JsonConvert.DeserializeObject(responseString);
List<LikeCount> LikeList = (List<LikeCount>)Newtonsoft.Json.JsonConvert.DeserializeObject(obj.ToString(), typeof(List<LikeCount>));

But getting the error

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

How can i fix this please help..


Solution

  • Your JSON element is an object, as it's delimited by { }, not an array which would be delimited by [ ]. So you can't just deserialize it into a List.

    Your object has key-value pairs, string being the key and your LikeCount being the value. As such, you should deserialize it to an IDictionary<string, LikeCount>:

    IDictionary<string, LikeCount> dict = Newtonsoft.Json.JsonConvert.DeserializeObject<IDictionary<string, LikeCount>>(responseString);
    

    If you only need a list of your LikeCount objects without the keys, you can then get them using the Values property. Then, depending on your needs, you may or may not need to convert it to a List via ToList:

    IDictionary<string, LikeCount> dict = Newtonsoft.Json.JsonConvert.DeserializeObject<IDictionary<string, LikeCount>>(responseString);
    List<LikeCount> likes = dict.Values.ToList();