反序列化动态对象

我试图弄清楚如何通过调用facebook api反序列化我的响应,我遇到了很多麻烦。 我的c#代码如下所示:

FacebookClient client = new FacebookClient(); string path = "SELECT message, type, attachment FROM stream WHERE source_id = " + fbid.ToString(); dynamic result = client.Get("fql", new { q = path }); 

这就是结果的样子 – 它以json的forms回归

我需要反序列化这个Dynamic对象,它是一个字符串json到ac#object。 不知道可以在动态对象上执行foreach循环。 我还试图创建一个对象并反序列化到我创建的对象。 问题是,正如您所看到的,有很多属性在大多数情况下都没有返回,有时它们会被返回。 因此Facebook返回的json总是拥有不同数量的属性。 我尝试doign一个for循环,然后通过像response.data.message [1]之类的东西从json中获取对象,但这不起作用。 任何想法如何将这个动态对象反序列化为我可以使用的某些东西?

 {"data": [ { "message": "", "type": null, "attachment": { "description": "" } }, { "message": "", "type": 80, "attachment": { "media": [ { "href": "https://www.facebook.com/pages/Team-Vintage/119337701414139", "alt": "", "type": "link", "src": "https://fbcdn-profile-a.akamaihd.net/hprofile-ak-prn1/71056_119337701414139_6207793_n.jpg" } ], "name": "Team Vintage", "href": "https://www.facebook.com/pages/Team-Vintage/119337701414139", "caption": "", "description": "Team Vintage is designed to handle all your event planning needs. We cater to individuals as well as groups and businesses focused on sporting events, concerts, tailgates, golf outings, as well as transportation via limos and party/coach buses.", "properties": [ { "name": "Page", "text": "245 like this" } ], "icon": "http://sofzh.miximages.com/c%23/0HZPW6-lhQu.png" } }, { "message": "", "type": 237, "attachment": { "media": [ { "href": "", "alt": "", "type": "swf", "src": "https://fbexternal-a.akamaihd.net/app_full_proxy.php?app=263101677125815&v=1&size=p&cksum=7d97808202a372d6392257f52d91e5d2&src=http%3A%2F%2Fi1.sndcdn.com%2Fartworks-000027234998-gkd71f-t500x500.jpg%3Fcc07a88", "swf": { "source_url": "http://player.soundcloud.com/player.swf?url=http%3A%2F%2Fapi.soundcloud.com%2Ftracks%2F50851560&color=3b5998&auto_play=true&show_artwork=false&origin=facebook", "preview_img": "https://fbexternal-a.akamaihd.net/app_full_proxy.php?app=263101677125815&v=1&size=p&cksum=7d97808202a372d6392257f52d91e5d2&src=http%3A%2F%2Fi1.sndcdn.com%2Fartworks-000027234998-gkd71f-t500x500.jpg%3Fcc07a88", "width": 460, "height": 98, "expanded_width": 0, "expanded_height": 0 } } ], "name": "Camp Bisco", "href": "http://soundcloud.com/amon-tobin/bed-time-stories-extended-live", "caption": "", "description": "Check out this extended track from Amon Tobin!", "properties": [], "icon": "http://sofzh.miximages.com/c%23/default_app_icon.gif" } }, { "message": "", "type": null, "attachment": { "description": "" } }, { "message": "", "type": 237, "attachment": { "media": [ { "href": "https://dev.fanfueledengage.com/share/auitbc", "alt": "", "type": "link", "src": "https://fbexternal-a.akamaihd.net/app_full_proxy.php?app=263101677125815&v=1&size=z&cksum=124f2c1fb6ea2fcaa8d98ebe0fd2246d&src=http%3A%2F%2Fimages.proboardshop.com%2Fbigagnes-elkpark20-long-right-sleepingbag-coalrust-13-thumb.jpg" } ], "name": "Proboardshop", "href": "https://dev.fanfueledengage.com/share/auitbc", "caption": "dev.fanfueledengage.com", "description": "I just bought Big Agnes Elk Park 20 Long Right Sleeping Bag Coal/Rust on FanFueled. I'm earning Camp Bisco points. Check it out. If you decide to make a purchase through my link, FanFueled will pay me a commission for it, cool huh?", "properties": [], "icon": "http://sofzh.miximages.com/c%23/default_app_icon.gif" } }, { "message": "", "type": 8, "attachment": { "description": "" } }, { "message": "", "type": 80, "attachment": { "media": [ { "href": "https://www.facebook.com/pages/Magnolia-Roller-Vixens/29048470621", "alt": "", "type": "link", "src": "https://fbcdn-profile-a.akamaihd.net/hprofile-ak-ash4/276513_29048470621_1691556_n.jpg" } ], "name": "Magnolia Roller Vixens", "href": "https://www.facebook.com/pages/Magnolia-Roller-Vixens/29048470621", "caption": "", "description": "Magnolia Roller Vixens is a community-wise sports initiative for adult females. Our purpose is for fun, friendly sports competition among like-minded women. Magnolia Roller Vixens promotes and fosters the sport of women's flat track derby by facilitating the development of athletic ability, sportsw...", "properties": [ { "name": "Page", "text": "2,717 like this" } ], "icon": "http://sofzh.miximages.com/c%23/0HZPW6-lhQu.png" } } ] } 

使用您的示例json,以下代码适用于我,

 dynamic response = JsonConvert.DeserializeObject(json); Console.WriteLine("PropName:" + response.data[1].attachment.properties[0].name); foreach (var data in response.data) { if (data.attachment != null) Console.WriteLine((string)data.attachment.name); } 

PS:我用的是Json.Net


 string json = @"{""data"": [ { ""message"": """", ""type"": null, ""attachment"": { ""description"": """" } }, { ""message"": """", ""type"": 80, ""attachment"": { ""media"": [ { ""href"": ""https://www.facebook.com/pages/Team-Vintage/119337701414139"", ""alt"": """", ""type"": ""link"", ""src"": ""https://fbcdn-profile-a.akamaihd.net/hprofile-ak-prn1/71056_119337701414139_6207793_n.jpg"" } ], ""name"": ""Team Vintage"", ""href"": ""https://www.facebook.com/pages/Team-Vintage/119337701414139"", ""caption"": """", ""description"": ""Team Vintage is designed to handle all your event planning needs. We cater to individuals as well as groups and businesses focused on sporting events, concerts, tailgates, golf outings, as well as transportation via limos and party/coach buses."", ""properties"": [ { ""name"": ""Page"", ""text"": ""245 like this"" } ], ""icon"": ""http://sofzh.miximages.com/c%23/0HZPW6-lhQu.png"" } }, { ""message"": """", ""type"": 237, ""attachment"": { ""media"": [ { ""href"": """", ""alt"": """", ""type"": ""swf"", ""src"": ""https://fbexternal-a.akamaihd.net/app_full_proxy.php?app=263101677125815&v=1&size=p&cksum=7d97808202a372d6392257f52d91e5d2&src=http%3A%2F%2Fi1.sndcdn.com%2Fartworks-000027234998-gkd71f-t500x500.jpg%3Fcc07a88"", ""swf"": { ""source_url"": ""http://player.soundcloud.com/player.swf?url=http%3A%2F%2Fapi.soundcloud.com%2Ftracks%2F50851560&color=3b5998&auto_play=true&show_artwork=false&origin=facebook"", ""preview_img"": ""https://fbexternal-a.akamaihd.net/app_full_proxy.php?app=263101677125815&v=1&size=p&cksum=7d97808202a372d6392257f52d91e5d2&src=http%3A%2F%2Fi1.sndcdn.com%2Fartworks-000027234998-gkd71f-t500x500.jpg%3Fcc07a88"", ""width"": 460, ""height"": 98, ""expanded_width"": 0, ""expanded_height"": 0 } } ], ""name"": ""Camp Bisco"", ""href"": ""http://soundcloud.com/amon-tobin/bed-time-stories-extended-live"", ""caption"": """", ""description"": ""Check out this extended track from Amon Tobin!"", ""properties"": [], ""icon"": ""http://sofzh.miximages.com/c%23/default_app_icon.gif"" } }, { ""message"": """", ""type"": null, ""attachment"": { ""description"": """" } }, { ""message"": """", ""type"": 237, ""attachment"": { ""media"": [ { ""href"": ""https://dev.fanfueledengage.com/share/auitbc"", ""alt"": """", ""type"": ""link"", ""src"": ""https://fbexternal-a.akamaihd.net/app_full_proxy.php?app=263101677125815&v=1&size=z&cksum=124f2c1fb6ea2fcaa8d98ebe0fd2246d&src=http%3A%2F%2Fimages.proboardshop.com%2Fbigagnes-elkpark20-long-right-sleepingbag-coalrust-13-thumb.jpg"" } ], ""name"": ""Proboardshop"", ""href"": ""https://dev.fanfueledengage.com/share/auitbc"", ""caption"": ""dev.fanfueledengage.com"", ""description"": ""I just bought Big Agnes Elk Park 20 Long Right Sleeping Bag Coal/Rust on FanFueled. I'm earning Camp Bisco points. Check it out. If you decide to make a purchase through my link, FanFueled will pay me a commission for it, cool huh?"", ""properties"": [], ""icon"": ""http://sofzh.miximages.com/c%23/default_app_icon.gif"" } }, { ""message"": """", ""type"": 8, ""attachment"": { ""description"": """" } }, { ""message"": """", ""type"": 80, ""attachment"": { ""media"": [ { ""href"": ""https://www.facebook.com/pages/Magnolia-Roller-Vixens/29048470621"", ""alt"": """", ""type"": ""link"", ""src"": ""https://fbcdn-profile-a.akamaihd.net/hprofile-ak-ash4/276513_29048470621_1691556_n.jpg"" } ], ""name"": ""Magnolia Roller Vixens"", ""href"": ""https://www.facebook.com/pages/Magnolia-Roller-Vixens/29048470621"", ""caption"": """", ""description"": ""Magnolia Roller Vixens is a community-wise sports initiative for adult females. Our purpose is for fun, friendly sports competition among like-minded women. Magnolia Roller Vixens promotes and fosters the sport of women's flat track derby by facilitating the development of athletic ability, sportsw..."", ""properties"": [ { ""name"": ""Page"", ""text"": ""2,717 like this"" } ], ""icon"": ""http://sofzh.miximages.com/c%23/0HZPW6-lhQu.png"" } } ] }"; 

我发布这个是因为上面没有解释什么是错的。

当json在动态对象中时,它已经被反序列化了。 您应该可以使用以下内容访问其成员:

 result[0].message; 

如果您希望将响应作为字符串,则需要执行以下操作:

 FacebookClient client = new FacebookClient(); string path = "SELECT message, type, attachment FROM stream WHERE source_id = " + fbid.ToString(); string result = client.Get("fql", new { q = path }).ToString(); ^^^ ^^^ 

希望这有助于某人。