1

我在试图弄清楚如何反序列化我对 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 形式返回

我需要反序列化这个动态对象,它是一个字符串 json 到 ac# 对象。不知道可以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"
        }
    }
 ]
}
4

2 回答 2

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""
        }
    }
 ]
}";
于 2013-08-05T01:04:30.637 回答
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();
 ^^^                                                  ^^^

希望这可以帮助某人。

于 2014-11-25T12:19:46.523 回答