Получить стену Facebook Facebook C # SDK -> Вложенный JSON - PullRequest
2 голосов
/ 16 января 2012

Я пытаюсь получить фейсбук, но у меня возникают проблемы со структурой JSON Nested.

ниже мой код до сих пор

var wall = (JsonObject)fb.Get("me/feed");
List<FBWall> myWall = new List<FBWall>();
foreach (var obj in (JsonArray)wall["data"])
{
    FBWall myWall = new Wall();
    myWall.Id = (string)(((JsonObject)obj)["id"]);

}

Фактическая строка в стене идет примерно так

{"data":[{"id":"576376893_10150590188751894","from":{"name":"Afnan Bashir","id":"576376893"},"story":"\"how are you man??? \" on Xain Ul-Abiddin's timeline."........ and so on

теперь у меня есть данные, но когда я это делаю (как должно быть, потому что основной файл содержит другие массивы json)

(((JsonObject)obj)["from"]) Я получаю {"name":"Afnan Bashir","id":"576376893"}

Теперь, как бы вы написали в foreach, чтобы получить все, не переходя к другому foreach. Я думал, что может быть с Linq

Ответы [ 2 ]

2 голосов
/ 21 мая 2012

Попробуйте это

public class Post
{
    public string ID { get; set; }    
    public BaseUser From { get; set; }    
    public string Text { get; set; }    
    public ItemType Type { get; set; }    
    public string Picture { set; get; }    
    public string Link { set; get; }    
    public string CreatedTime { get; set; }    
    public string UpdatedTime { get; set; }
}

public class BaseUser
{
    public string ID { get; set; }    
    public string Name { get; set; }
}

public enum ItemType
{
    Story,
    Message
}
try
{
     List<Post> posts = new List<Post>();
     dynamic p = (IDictionary<string, object>)fb.Get(userID + "/feed");
     foreach (dynamic item in p.data)
     {
     try
     {
        Dictionary<string, object>.KeyCollection keys = item.Keys;        
        Post post = new Post();        
        if (keys.Contains<string>("story"))
        {
          post.Type = ItemType.Story;
          post.Text = item.story;
          post.Link = item.link;
          post.Picture = item.picture;
        }
        else if (keys.Contains<string>("message"))
        {
          post.Type = ItemType.Message;
          post.Text = item.message;
          //post.Link = user.Link;
          //post.Picture = item.picture;
        }
        keys = null;        
        post.ID = item.id;
        post.UpdatedTime = item.updated_time;
        post.CreatedTime = item.created_time;

        BaseUser baseUser = new BaseUser();

        dynamic from = item.from;
        baseUser.ID = from.id;
        baseUser.Name = from.name;
        post.From = baseUser;
        posts.Add(post);        
      }
      catch (Exception)
      {}
    }
  }
  catch (Exception)
  {}
1 голос
/ 16 января 2012

Всегда трудно привести такой объект, как FbWall, к возвращенным результатам API Graph. Как бы мне ни нравилась безопасность типов и возможность видеть ошибки во время компиляции, было слишком сложно прикладывать динамические данные к типу.

Итак, я привык к использованию dynamic (если вы используете 4.0).

Если вы не используете 4.0, вы можете продолжать использовать wall["data][0]["from"][0]["name"], чтобы получить значения возвращаемого объекта.

Мне действительно нравится жить в тепле и уюте безопасности типов, и я пинал и кричал о необходимости жить по этой неизвестной и неудобной дороге. Все будет хорошо, просто "прикуси пулю" и "добудь".

...