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类型(例如,不是整数的基本类型,不是集合 类似于数组或列表,可以是
我查看了其他帖子。
我的json看起来像这样:
{"data":[{"target_id":9503123,"target_type":"user"}]}
答案 0 :(得分:37)
为了说清楚,除了@SLaks的回答,这意味着你需要改变这一行:
List<RootObject> datalist = JsonConvert.DeserializeObject<List<RootObject>>(jsonstring);
这样的事情:
RootObject datalist = JsonConvert.DeserializeObject<RootObject>(jsonstring);
答案 1 :(得分:10)
由于错误消息很难告诉您,您无法将单个对象反序列化为集合(List<>
)。
您想要反序列化为单个RootObject
。
答案 2 :(得分:2)
这也发生在我身上,因为我试图获得一个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();
}
希望它有所帮助。
答案 3 :(得分:1)
是否可以像下面这样用data
键来更改json?
{[{"target_id":9503123,"target_type":"user"}]}
答案 4 :(得分:0)
真正的问题是您在FacebookClient 获取方法中使用动态返回类型。虽然您使用方法进行序列化,但JSON转换器之后无法反序列化此Object。
使用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);
希望这有帮助。
答案 5 :(得分:-4)
您的SQL Server已关闭或 数据库服务器不可用。