2012-12-01 30 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