Невозможно десериализовать текущий объект JSON (например, { "name": "value" }) в тип 'System.Collections.Generic.List`1

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

Невозможно десериализовать текущий объект JSON (например, { "name": "value" }) в тип 'System.Collections.Generic.List`1 [facebook.Program + RootObject] потому что для этого требуется массив JSON (например, [1,2,3]) для десериализации правильно. Чтобы исправить эту ошибку, либо измените JSON на массив JSON (например, [1,2,3]) или изменить десериализованный тип, чтобы он был нормальным Тип .NET(например, не примитивный тип типа integer, а не набор типа массива или списка), которые могут быть

Я просмотрел другие сообщения.

Мой json выглядит так:

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

Ответы

Ответ 1

Чтобы было понятно, в дополнение к ответу @SLaks, это означало, что вам нужно изменить эту строку:

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

примерно так:

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

Ответ 2

Поскольку сообщение об ошибке очень сложно сказать вам, вы не можете десериализовать один объект в коллекцию (List<>).

Вы хотите десериализовать в один RootObject.

Ответ 3

Это случилось со мной, потому что я пытался получить IEnumerable, но ответ имел одно значение. Попробуйте убедиться, что в вашем ответе указан список данных. Линии, которые я использовал (для api url get) для решения проблемы, следующие:

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

Надеюсь, что это поможет.

Ответ 4

Реальная проблема заключается в том, что вы используете динамический тип возврата в методе FacebookClient Get. И хотя вы используете метод для сериализации, конвертер JSON не может десериализовать этот объект после этого.

Использовать insted из:

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

что-то вроде этого:

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

Затем вы можете использовать метод DeserializeObject:

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

Надеюсь, что это поможет.