2012-02-09 104 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