2012-02-09 35 views
3

我下面的函数获取Facebook数据并将其作为字符串返回。将Json反序列化为在Asp.net中实现Ienumerable的类

public static string GetUserNewsFeed(string strAccessToken) 
{ 
    Dictionary<string, object> PostDetail = new Dictionary<string, object>(); 
    DateTime CreatedDateTime = DateTime.Today.AddDays(-90); 
    var epoch = (CreatedDateTime.ToUniversalTime().Ticks - 621355968000000000)/10000000; 
    PostDetail.Add("Posts", "SELECT post_id,source_id FROM stream WHERE filter_key in (SELECT filter_key FROM stream_filter WHERE uid=me() AND type='newsfeed') and (likes.count > 0 or comments.count > 0) and created_time > " + epoch); 
    PostDetail.Add("PostComments", "select post_id,fromid from comment where post_id in (select post_id from #Posts)"); 
    PostDetail.Add("PostLikes", "SELECT object_id,post_id,user_id FROM like WHERE post_id in (select post_id from #Posts)"); 
    string Json = HttpUtility.UrlEncode(Newtonsoft.Json.JsonConvert.SerializeObject(PostDetail));  
    return RunFQLQuery(Json, strAccessToken); 
} 

下面是调用该函数,并将其转换使用到Jobject Json.NET代码:

strFeed = FacebookAPI.GetUserNewsFeed(Convert.ToString(Session["access_token"])); 
JObject objStreamData = JObject.Parse(strFeed); 
var PostResponse = objStreamData.SelectToken("data[0]"); 

下面这行反序列化NewsFeedPost类:

var Posts = JsonConvert.DeserializeObject<NewsFeedPost>(PostResponse.ToString()); 

及以下是等级:

public class NewsFeedPost 
{  
    public string name { get; set; } 
    public List<Post> fql_result_set { get; set; } 
} 
public class Post 
{ 
    public string post_id { get; set; } 
    public string source_id { get; set; } 
} 

现在的问题是,当我改变我的NewsFeedPost类低于它抛出错误“无法反序列化JSON对象转换型‘BAL.NewsFeedPost’”:

public class NewsFeedPost : IEnumerable<Post> 
{  
    public string name { get; set; } 
    public List<Post> fql_result_set { get; set; } 
    public IEnumerator<Post> GetEnumerator() 
    { 
     foreach (Post item in fql_result_set) 
     { 
      yield return item; 
     } 
    } 
    IEnumerator IEnumerable.GetEnumerator() 
    { 
     return GetEnumerator(); 
    } 

} 

下面是JSON响应的示例:

{ 
    "data": [ 
{ 
    "name": "Posts", 
    "fql_result_set": [ 
    { 
     "post_id": "1" 
    }, 
    { 
     "post_id": "2" 
    } 
    ] 
}, 
{ 
    "name": "PostComments", 
    "fql_result_set": [ 
    { 
     "post_id": "3", 
     "fromid": 4 
    }, 
    { 
     "post_id": "5", 
     "fromid": 6 
    } 
    ] 
}, 
{ 
    "name": "PostLikes", 
    "fql_result_set": [ 
    { 
     "object_id": 7, 
     "post_id": "8", 
     "user_id": 9 
    }, 
    { 
     "object_id": 10, 
     "post_id": "11", 
     "user_id": 12 
    } 
    ] 
} 
] 
} 

我只想通过列表枚举并创建逗号分隔列表并将其保存到数据库。任何人都可以提出一些需要解决的问题吗?我如何获得List的Count和Length属性?

+0

铸造你可以发布您试图反序列化JSON的例子吗? – 2012-02-09 14:01:53

回答

5

两件事情:

1)添加JsonObjectAttributeNewsFeedPost

[JsonObject] 
public class NewsFeedPost : IEnumerable<Post> 

2)反序列化JSON你展示,你需要另一个类:

public class NewsFeedPosts 
{ 
    public List<NewsFeedPost> Data { get; set; } 
} 

,然后你'd打电话给你想要反序列化的那个类别的deseralize:

var Posts = JsonConvert.DeserializeObject<NewsFeedPosts>(PostResponse.ToString()); 
+0

只需用JsonObject属性装饰我的类就行,并且不必再声明一个类。非常感谢。我真的很感激。 – user686021 2012-02-10 05:10:12

0

你可能想尝试在DeserializeObject

var Posts = JsonConvert.DeserializeObject<NewsFeedPost>((NewsFeedPost)PostResponse.ToString()); 
+0

DeserializeObject接受字符串参数 – user686021 2012-02-10 04:55:32

+0

您是否将字符串转换为NewsFeedPost?这是错误的代码。 – 2017-09-30 17:27:06