I am having a lot of trouble trying to figure out how to deserialize my response from making calls to facebook api. my c# code looks like this:
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 });
this is what result looks like - it comes back as json
I need to deserialize this Dynamic object , which is a string json into a c# object. don't know that it is possible to do a foreach
loop on a dynamic object. I also tried to just create an object and the deserialize to the object I created. The problem is that as you can see there are a lot of properties that are not returned most of the time , then some times they are returned. So the json that Facebook is returning always has a different amount of properties. I tried doign a for
loop then getting the objects out of json by something like response.data.message[1] , but that does not work. Any ideas how to get this dynamic object deserialized into somethign that I can use?
{"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": "https://fbstatic-a.akamaihd.net/rsrc.php/v2/yf/r/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": "https://www.facebook.com/images/icons/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": "https://www.facebook.com/images/icons/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": "https://fbstatic-a.akamaihd.net/rsrc.php/v2/yf/r/0HZPW6-lhQu.png"
}
}
]
}
Using your sample json, following code works for me,
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: I used 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"": ""https://fbstatic-a.akamaihd.net/rsrc.php/v2/yf/r/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"": ""https://www.facebook.com/images/icons/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"": ""https://www.facebook.com/images/icons/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"": ""https://fbstatic-a.akamaihd.net/rsrc.php/v2/yf/r/0HZPW6-lhQu.png""
}
}
]
}";
I am posting this because the above does not explain what is wrong.
Your json is already deserialized when it is in the dynamic object. You should be able to access to its members with something like this:
result[0].message;
If you want your response as a string you need to do this:
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();
^^^ ^^^
Hope this helps someone.
来源:https://stackoverflow.com/questions/18049064/deserialize-dynamic-object