2012-12-01 45 views
2

我得到了一個對象從Facebook SDKC#的Facebook SDK動態數據轉換

var responsePages = (JsonObject)FBClient_.Get(new { ids = 
[123123123, 123123123, 12312213, etc]}); 

該查詢返回的數據(見圖片)

Results

現在我該怎樣轉換到這個列表對象? 我曾嘗試以下,但它不工作

var pe = (from dynamic page 
       in (IList<object>)(object)responsePages.Values 
          orderby page.name ascending 
          select new FBPage 
          { 
           Id = Convert.ToString(page.id), 
          } 
       ).ToList(); 

這樣失敗了,因爲這個充滿活力的東西,使我認真瘋希望得到任何幫助。

感謝

回答

3

你並不需要,如果你使用動態投。

var fb = new FacebookClient(); 

dynamic result = fb.Get(new { ids = new[] { "...", "..." } }); 

var pages = new List<FBPage>(); 
foreach (var page in result.Values) 
{ 
    var fbPage = new FBPage { 
     Id = page.id, 
     Name = page.name 
    }; 

    pages.Add(fbPage); 
} 

,或者如果你想使用LINQ。 (擴展方法不支持動態的,所以你需要做一些鑄造,JsonObject => IDictionary<string, dyanmic>JsonArray => IList<dynamic>

var pages = ((IDictionary<string, dynamic>)result) 
    .Select(kpv => kpv.Value) 
    .Select(p => new FBPage { id = p.id, name = p.name }) 
    .ToList(); 

或者你強類型的類。

var fbPages = fb.Get<IDictionary<string, FBPage>>(new { 
    ids = new[] { "...", "..." } 
}).Values; 

public class FBPage 
{ 
    public string id { get; set; } 
    public string name { get; set; } 
} 
0

「responsePages.Values」是ICollection<JsonValue>

JsonValues可序列化到JSON字符串,然後可以取得良好的Json串器玩的東西,如Json.Net。

使用一個簡單的循環,這可能看起來像:

List<dynamic> dynamicList = new List<dynamic>(); 
List<FBPage> pe = new List<FBPage>(); 

foreach(var page in responsePages.Values) 
{ 
    //ToString is overridden in JsonValue to provide a string in Json format 
    string pageAsJsonString = page.ToString(); 

    //Deserialize (parse) to a dynamic object using Json.Net's JObject.Parse static method 
    dynamic parsedPage = JObject.Parse(pageAsJsonString); 
    dynamicList.Add(parsedPage); 

    //Alternatively, if you have an appropriate object handy, deserialize directly: 
    FBPage deserializedPage = JsonConvert.DeserializeObject<FBPage>(pageAsJsonString); 
    pe.Add(deserializedPage); 
} 

foreach(dynamic page in dynamicList) 
{ 
    Console.WriteLine(page.name); 
} 

foreach(FBPage page in pe) 
{ 
    Console.WriteLine(page.Id); 
} 
+0

謝謝你,這是工作,但我仍然認爲這是很多不必要的鑄造和轉換的方式。但是,這是有效的,並且非常感謝。 – Tim

+0

我發佈了另一個避免投射或直接使用強類型類的答案。 @chamila_c你不應該調用ToString(),然後使用JObject.Parse,這將是昂貴的,因爲你將會反序列化兩次。如果您想使用json.net FacebookClient.SetDefaultJsonSerializers(JsonConvert.SerializeObject,JsonConvert.DeserializeObject),請更改JsonSerializers;或fb.SetJsonSerializers(...)如果你想每個實例。 – prabir