2015-02-04 3 views
0

Я использую графство Facebook Api для получения сообщений с страницы Facebook, которую я администрирую. Чтобы получить URL-адрес полной картинки с сообщением, я включил поле «вложения». JSon получается следующим образом:Упростить поиск вложенных значений Json с помощью Json.NET

{ 
    "data": [ 
    { 
     "message": "Using Facebook's Graph Api to get Testdrive's news from the Facebook page on to the website. So this post will be visible in a minute at the website as well. Cool!", 
     "link": "https://www.facebook.com/TestdriveDressage/photos/a.493612667417831.1073741827.493607594085005/681741335271629/?type=1&relevant_count=1", 
     "picture": "https://scontent-b.xx.fbcdn.net/hphotos-xpf1/v/t1.0-9/s130x130/10394069_681741335271629_2094079936902591674_n.png?oh=85676b5ec301e78bd15e2cabde9b8f8f&oe=5561C419", 
     "id": "493607594085005_681741408604955", 
     "created_time": "2015-02-03T15:58:54+0000", 
     "attachments": { 
     "data": [ 
      { 
      "description": "Using Facebook's Graph Api to get Testdrive's news from the Facebook page on to the website. So this post will be visible in a minute at the website as well. Cool!", 
      "media": { 
       "image": { 
       "height": 666, 
       "src": "https://scontent-b.xx.fbcdn.net/hphotos-xpf1/v/t1.0-9/s720x720/10394069_681741335271629_2094079936902591674_n.png?oh=ac58799007b9b909ebc9f0ca762fd6c6&oe=554BD8A3", 
       "width": 720 
       } 
      }, 
      "target": { 
       "id": "681741335271629", 
       "url": "https://www.facebook.com/TestdriveDressage/photos/a.493612667417831.1073741827.493607594085005/681741335271629/?type=1" 
      }, 
      "title": "Timeline Photos", 
      "type": "photo", 
      "url": "https://www.facebook.com/TestdriveDressage/photos/a.493612667417831.1073741827.493607594085005/681741335271629/?type=1" 
      } 
     ] 
     } 
    }, ... next "post" 

Теперь я использую Json.NET в ск, как это, чтобы получить post.data.attachments.media.image.src:

FacebookClient fbClient = new FacebookClient(HttpContext.Current.Session[SessionFacebookAccessToken].ToString()); 
        JObject posts = JObject.Parse(fbClient.Get(String.Format("/{0}/posts?fields=message,picture,link,attachments", FacebookPageId)).ToString()); 
        JArray postItems = (JArray)posts["data"]; 
        List<NewsItem> newsItems = new List<NewsItem>(); 

        NewsItem ni; 

        foreach (JToken item in postItems.Where(item => item["message"] != null)) 
        { 
         ni = new NewsItem { Message = item.Value<String>("message"), DateTimeCreation = item.Value<DateTime?>("created_time"), Link = item.Value<String>("link"), Thumbnail = item.Value<String>("picture") }; 

         JToken attachments = item["attachments"]; 

         // "Browse" attachments node for possible links to larger image... 
         if (attachments != null) 
         { 
          JToken attachmentsData = attachments["data"]; 

          if (attachmentsData != null) 
          { 
           JToken attachmentsArray = attachments["data"]; 

           if (attachmentsArray != null) 
           { 
            JToken media = attachmentsArray[0]; 

            if (media != null) 
            { 
             JToken media2 = media["media"]; 

             if (media2 != null) 
             { 
              JToken image = media2["image"]; 

              if (image != null) 
              { 
               ni.Image = image.Value<String>("src"); 
              } 
             } 
            } 
           } 
          } 
         } 

         newsItems.Add(ni); 
        } 

Есть в любом случае я могу упростить это?

Он чувствует себя немного странно, и я не так счастлива с ним ... Я уже пробовал item["attachments"]["data"]["media"]["image"]["src"], но не работает, потому что есть массив в «данные» Я думаю

Любой совет или объяснение ценится ,

ответ

1

Попробуйте использовать SelectToken(). Вы можете указать путь к требуемому значению. Если какой-либо элемент по пути имеет значение null, все выражение будет равно null. Это может значительно упростить ваш код. Я добавил скрипку, чтобы продемонстрировать.

string url = (string)item.SelectToken("attachments.data[0].media.image.src"); 

Fiddle: https://dotnetfiddle.net/YL6t5c

+0

Отлично! Работает как шарм :) –

Смежные вопросы