2013-08-05 80 views
0

我有很多麻煩試圖找出如何反序製作我的迴應調用Facebook的API 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成C#對象。不知道可以在動態對象上執行foreach循環。我也嘗試創建一個對象,並對我創建的對象進行反序列化。問題是,正如你所看到的,有很多屬性不是大部分時間返回的,那麼有時它們會被返回。所以Facebook返回的json總是有不同數量的屬性。我嘗試了一個for循環,然後通過類似response.data.message [1]的方式將對象從json中取出,但這不起作用。任何想法如何讓這個動態對象反序列化成somethign我可以使用?

{"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" 
     } 
    } 
] 
} 
+0

它甚至反序列化成一個正確的對象?是否有可能定義一個類型的最大數量從源接收到的屬性,然後將json反序列化爲strognly類型的對象? – Nilesh

回答

2

使用您的樣品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"" 
     } 
    } 
] 
}"; 
+0

這就是我一直在嘗試 - 我的代碼的第一行出現錯誤「最好的重載方法匹配'Newtonsoft.Json.JsonConvert.DeserializeObject(string)'有一些無效的參數」 –

+0

@ScottSelby你通過什麼到'DeserializeObject'。它必須是*字符串* – I4V

+0

傳入的字符串中,我代替你的代碼中的json是我在我的問題中確切的字符串 –

0

我張貼這一點,因爲上面並不解釋什麼是錯的。

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

希望這可以幫助別人。