Невозможно десериализовать текущий объект 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);
Надеюсь, что это поможет.