2014-01-26 45 views
16
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对象(例如{‘名’ :“value”}) into type 'System.Collections.Generic.List`1 [facebook.Program + RootObject]' 因为该类型需要一个JSON数组(例如[1,2,3])来正确地反序列化 。要解决这个错误,可以将JSON更改为JSON数组(例如[1,2,3]),或者更改反序列化类型,使其成为正常的 .NET类型(例如,不是像integer这样的基本类型,也不是集合 类型像一个数组或列表)可以是无法反序列化当前JSON对象(例如{“名称”:“值”})成型“System.Collections.Generic.List`1

我看了其他职位。

我的JSON是这样的:

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

有*一个*根对象('{“data”:..}'),而不是它们的列表。 – user2864740

回答

9

随着错误消息拼命的告诉你,你不能反序列化一个对象到一个集合(List<>)。

您想要反序列化为一个RootObject

23

要清楚,除了@SLaks的回答,这意味着你需要改变这一行:

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

是这样的:

RootObject datalist = JsonConvert.DeserializeObject<RootObject>(jsonstring); 
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(); 
} 

希望它有帮助。

0

真正的问题是,你在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); 

希望这有助于。

相关问题