反序列化动态对象

时间:2013-08-05 00:30:50

标签: c# json rest facebook-c#-sdk

我在试图弄清楚如何通过调用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的形式返回

我需要将这个Dynamic对象反序列化,这是一个字符串json到c#对象。不知道可以在动态对象上进行foreach循环。我还试图创建一个对象并反序列化到我创建的对象。问题是,你可以看到有很多属性在大多数时候都没有返回,有时它们会被返回。所以Facebook返回的json总是拥有不同数量的属性。我尝试了一个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": "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"
        }
    }
 ]
}

2 个答案:

答案 0 :(得分:3)

使用您的示例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"": ""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""
        }
    }
 ]
}";

答案 1 :(得分:1)

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

当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();
 ^^^                                                  ^^^

希望这有助于某人。