Cannot deserialize the current JSON object (e.g. {"name":"value"}) into type 'System.Collections.Generic.List`1

163,148

Solution 1

To make it clear, in addition to @SLaks' answer, that meant you need to change this line :

List<RootObject> datalist = JsonConvert.DeserializeObject<List<RootObject>>(jsonstring);

to something like this :

RootObject datalist = JsonConvert.DeserializeObject<RootObject>(jsonstring);

Solution 2

As the error message is trying very hard to tell you, you can't deserialize a single object into a collection (List<>).

You want to deserialize into a single RootObject.

Solution 3

That happened to me too, because I was trying to get an IEnumerable but the response had a single value. Please try to make sure it's a list of data in your response. The lines I used (for api url get) to solve the problem are like these:

HttpResponseMessage response = await client.GetAsync("api/yourUrl");

if (response.IsSuccessStatusCode)
{
    IEnumerable<RootObject> rootObjects =
        awaitresponse.Content.ReadAsAsync<IEnumerable<RootObject>>();

    foreach (var rootObject in rootObjects)
    {
        Console.WriteLine(
            "{0}\t${1}\t{2}",
            rootObject.Data1, rootObject.Data2, rootObject.Data3);
    }

    Console.ReadLine();
}

Hope It helps.

Solution 4

Can you try to change your json without data key like below?

[{"target_id":9503123,"target_type":"user"}]

Solution 5

The real problem is that you are using dynamic return type in the FacebookClient Get method. And although you use a method for serializing, the JSON converter cannot deserialize this Object after that.

Use insted of:

dynamic result = client.Get("fql", new { q = "select target_id,target_type from connection where source_id = me()"}); 
string jsonstring = JsonConvert.SerializeObject(result);

something like that:

string result = client.Get("fql", new { q = "select target_id,target_type from connection where source_id = me()"}).ToString();

Then you can use DeserializeObject method:

var datalist = JsonConvert.DeserializeObject<List<RootObject>>(result);

Hope this helps.

Share:
163,148
Admin
Author by

Admin

Updated on February 06, 2022

Comments

  • Admin
    Admin about 2 years
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using Facebook;
    using Newtonsoft.Json;
    
    namespace facebook
    {
        class Program
        {
            static void Main(string[] args)
            {
                var client = new FacebookClient(acc_ess);
                dynamic result = client.Get("fql", new { q = "select target_id,target_type from connection where source_id = me()"});
                string jsonstring = JsonConvert.SerializeObject(result);
    
                //jsonstring {"data":[{"target_id":9503123,"target_type":"user"}]}
                List<RootObject> datalist = JsonConvert.DeserializeObject<List<RootObject>>(jsonstring);
            }
    
            public class Datum
            {
                public Int64 target_id { get; set; }
                public string target_type { get; set; }
            }
    
            public class RootObject
            {          
                public List<Datum> data { get; set; }
            }
        }
    }
    

    Cannot deserialize the current JSON object (e.g. {"name":"value"}) into type 'System.Collections.Generic.List`1[facebook.Program+RootObject]' 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

    I looked at other posts.

    My json looks like this:

    {"data":[{"target_id":9503123,"target_type":"user"}]}