无法将当前JSON对象(例如{“name”:“value”})反序列化为类型'System.Collections.Generic.List`1

时间:2014-01-26 01:26:27

标签: c# json facebook json.net

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"}]}

6 个答案:

答案 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已关闭或 数据库服务器不可用。