2016-09-06 15 views
0

Facebook Graph APIを使用していくつかの情報を表示しようとしています。私はNewtonsoft.JSONを使用しています。ここで複数のレベルでFacebook Graph API JSONから特定のフィールドを表示

は私のURLクエリの結果である:ここで

{ 
    "albums": { 
     "data": [ 
     { 
      "name": "Album 1", 
      "photos": { 
       "data": [ 
        { 
        "id": "686123475970" 
        }, 
        { 
        "id": "686203123490" 
        }, 
        { 
        "id": "686212345870" 
        }, 
        { 
        "id": "612343620880" 
        }, 
        { 
        "comments": { 
         "data": [ 
          { 
           "from": { 
           "name": "John Smith", 
           "id": "10206512123464061" 
           }, 
           "message": "Test Comment 1 string value", 
           "id": "1571234466083854" 
          } 
         ], 
         "paging": { 
          "cursors": { 
           "before": "WTI5dGJXVnVkRjlqZAFhKemIzSTZANVFUzTlRVNU1EUTJOakE0TXpnMU5Eb3hORGN6TkRZAMk5EWTQZD", 
           "after": "WTI5dGJXVnVkRjlqZAFhKemIzSTZANVFUzTlRVNU1EUTJOakE0TXpnMU5Eb3hORGN6TkRZAMk5EWTQZD" 
          } 
         } 
        }, 
        "id": "612343615890" 
        }, 
        { 
        "id": "686203123430" 
        }, 

私は発電機から得たJSONの構造である:

public class From 
{ 
    public string name { get; set; } 
    public string id { get; set; } 
} 

public class Datum3 
{ 
    public From from { get; set; } 
    public string message { get; set; } 
    public string id { get; set; } 
} 

public class Cursors 
{ 
    public string before { get; set; } 
    public string after { get; set; } 
} 

public class Paging 
{ 
    public Cursors cursors { get; set; } 
} 

public class Comments 
{ 
    public List<Datum3> data { get; set; } 
    public Paging paging { get; set; } 
} 

public class Datum2 
{ 
    public string id { get; set; } 
    public Comments comments { get; set; } 
} 

public class Cursors2 
{ 
    public string before { get; set; } 
    public string after { get; set; } 
} 

public class Paging2 
{ 
    public Cursors2 cursors { get; set; } 
} 

public class Photos 
{ 
    public List<Datum2> data { get; set; } 
    public Paging2 paging { get; set; } 
} 

public class Datum 
{ 
    public string name { get; set; } 
    public Photos photos { get; set; } 
    public string id { get; set; } 
} 

public class Cursors3 
{ 
    public string before { get; set; } 
    public string after { get; set; } 
} 

public class Paging3 
{ 
    public Cursors3 cursors { get; set; } 
} 

public class Albums 
{ 
    public List<Datum> data { get; set; } 
    public Paging3 paging { get; set; } 
} 

public class RootObject 
{ 
    public Albums albums { get; set; } 
    public string id { get; set; } 
} 

With help、私はからのメンバーのリストを取得することができましたこのコードを使用して、異なるJSON構造:

RootObject1 obj = JsonConvert.DeserializeObject<RootObject1>(responseFromServer); 
List<string> members = obj.members.data.Select(d => d.name).ToList(); 
CurrentMembersDisplay.Text = string.Join("\r\n", members); 
TotalMemberCount.Text = members.Count.ToString(); 

は最終的に、私の最終目標はにあります投稿者の名前、コメントしたアルバム、コメントには特定のキーワードが含まれている場合のみコメントが表示されます。だから私は "ジョン・スミス - アルバム1 - コメント"のようなものを見たいと思っています

私はこれらの3つのアイテムを異なるレベルで一緒にリンクさせるのに苦労しています。

誰かがこれで私を助けることができる方法はありますか?

+0

詳細情報が必要です - まず、JSONを編集したイメージではなくテキストとして投稿してください。それでもデータ構造をよく表している限り、データを匿名化してサイズを減らしても問題ありません。つまり、中括弧/中括弧は中かっこ/括弧で囲んでいます。これにより、私たちの手助けがさらに簡単になります。次に、「アルバム」と「キーワード」とは何ですか?あなたのJSONもクラスにも、これらのことは言及されていません。このデータはどこから来たのですか? –

+0

こんにちはブライアン、私はこれを再度生成し、テキストとして投稿しようとします。申し訳ありません、アルバムはURLにあり、私はちょうどそれをつかむことができるので、それを心配する必要はありません。キーワードはメッセージテキストに含まれます。最終的には上記の例から、私が選択した任意の種類のキーワードを含むリンクされたメッセージを表示したいと思いますが、ハードコードすることができます。だから、本当に、私はメッセージ構造とメッセージそのものの下の "From"フィールドに入るのを助ける必要があります。それはすべて文字列データです。私は再び構造を得るために働くでしょう。ありがとう! – Dshel7702

+0

ブライアンにもう一度感謝します。私は新しいコードと結果を投稿しました。 – Dshel7702

答えて

0

古い旧式のループをより快適に使用するか、より簡潔なLINQコードを使用するかによって、これを行う方法はいくつかあります。ここで

は、ループを使用して伝統的な方法である:

public static List<string> GetComments(RootObject root, string keyword) 
{ 
    List<string> list = new List<string>(); 
    foreach (Datum a in root.albums.data) 
    { 
     foreach (Datum2 p in a.photos.data) 
     { 
      if (p.comments != null) 
      { 
       foreach (Datum3 c in p.comments.data) 
       { 
        if (c.message.IndexOf(keyword, StringComparison.OrdinalIgnoreCase) >= 0) 
        { 
         list.Add(c.from.name + " - " + a.name + " - " + c.message); 
        } 
       } 
      } 
     } 
    } 
    return list; 
} 
ここ

は、LINQのメソッドを使用して同等の方法である:

public static List<string> GetComments(RootObject root, string keyword) 
{ 
    return root.albums.data 
     .SelectMany(a => a.photos.data, (a,p) => new { Album = a.name, Comments = p.comments }) 
     .Where(p => p.Comments != null) 
     .SelectMany(p => p.Comments.data, (p,c) => new { Album = p.Album, From = c.from, Message = c.message }) 
     .Where(c => c.Message.IndexOf(keyword, StringComparison.OrdinalIgnoreCase) >= 0) 
     .Select(c => c.From.name + " - " + c.Album + " - " + c.Message) 
     .ToList(); 
} 

あなたは、このような上記のコードを使用することができます

RootObject root = JsonConvert.DeserializeObject<RootObject>(json); 
List<string> comments = GetComments(root, "test"); 
textBox1.Text = string.Join("\r\n", comments); 

フィドル:https://dotnetfiddle.net/RgimOG

+0

こんにちはBrian、 JSONにアルバム名を含めるように質問を編集しました。私はURLの代わりにソースから取得できるとわかりませんでした。技術的には、この構造では10枚以上のアルバムを持つことができます。以前に気付かなかったことに対する謝罪。 – Dshel7702

+0

@ Dshel7702私は複数のアルバムを扱うために私の答えを更新しました。お役に立てれば。 –

関連する問題