0

Below is my returned json from twitter

{
"created_at": "Sat, 11 Feb 2012 06:38:28 +0000",
"entities": {
  "hashtags": [
    {
      "text": "Shubhdin",
      "indices": [
        9,
        18
      ]
    }
  ],
  "urls": [],
  "user_mentions": [
    {
      "screen_name": "SAMdLaw",
      "name": "Sabyasachi Mohapatra",
      "id": 104420398,
      "id_str": "104420398",
      "indices": [
        0,
        8
      ]
    }
  ]
},
"from_user": "nilayshah80",
"from_user_id": 213599118,
"from_user_id_str": "213599118",
"from_user_name": "Nilay Shah",
"geo": {
  "coordinates": [
    18.6003,
    73.825
  ],
  "type": "Point"
},
"id": 168222351106899968,
"id_str": "168222351106899968",
"iso_language_code": "in",
"metadata": {
  "result_type": "recent"
},
"profile_image_url": "http://a2.twimg.com/profile_images/1528184590/IMG_0465_normal.JPG",
"profile_image_url_https": "https://si0.twimg.com/profile_images/1528184590/IMG_0465_normal.JPG",
"source": "<a href="http://twabbit.wordpress.com/" rel="nofollow">twabbit</a>",
"text": "@SAMdLaw #Shubhdin mitra",
"to_user": "SAMdLaw",
"to_user_id": 104420398,
"to_user_id_str": "104420398",
"to_user_name": "Sabyasachi Mohapatra",
"in_reply_to_status_id": 168219865197461505,
"in_reply_to_status_id_str": "168219865197461505"
},
{
"created_at": "Sun, 12 Feb 2012 01:54:07 +0000",
"entities": {
  "hashtags": [
    {
      "text": "IWIllAlwaysLoveYou",
      "indices": [
        88,
        107
      ]
    }
  ],
  "urls": [],
  "user_mentions": [],
  "media": [
    {
      "id": 168513175187238912,
      "id_str": "168513175187238912",
      "indices": [
        108,
        128
      ],
      "media_url": "http://p.twimg.com/Alat1wsCMAAh-wE.jpg",
      "media_url_https": "https://p.twimg.com/Alat1wsCMAAh-wE.jpg",
      "url": "http://shortener.twitter.com/dRc4dXH3",
      "display_url": "pic.twitter.com/dRc4dXH3",
      "expanded_url": "http://twitter.com/RIPWhitneyH/status/168513175183044608/photo/1",
      "type": "photo",
      "sizes": {
        "orig": {
          "w": 395,
          "h": 594,
          "resize": "fit"
        },
        "large": {
          "w": 395,
          "h": 594,
          "resize": "fit"
        },
        "thumb": {
          "w": 150,
          "h": 150,
          "resize": "crop"
        },
        "small": {
          "w": 340,
          "h": 511,
          "resize": "fit"
        },
        "medium": {
          "w": 395,
          "h": 594,
          "resize": "fit"
        }
      }
    }
  ]
},
"from_user": "RIPWhitneyH",
"from_user_id": 19319043,
"from_user_id_str": "19319043",
"from_user_name": "RIP Whitney Houston",
"geo": null,
"id": 168513175183044608,
"id_str": "168513175183044608",
"iso_language_code": "en",
"metadata": {
  "recent_retweets": 8,
  "result_type": "popular"
},
"profile_image_url": "http://a2.twimg.com/profile_images/1820957590/images__13__normal.jpg",
"profile_image_url_https": "https://si0.twimg.com/profile_images/1820957590/images__13__normal.jpg",
"source": "<a href="http://twitter.com/">web</a>",
"text": "R-T if you think that the Grammy's should organize an \"R.I.P. Whitney Houston\" tribute. #IWIllAlwaysLoveYou http://shortener.twitter.com/dRc4dXH3",
"to_user": null,
"to_user_id": null,
"to_user_id_str": null,
"to_user_name": null
},

If you noticed Media under entities not available in above 2 and when i tried to call below snippet gives me null reference error

 MediaUrl = (from user in tweet["entities"]["media"]
 select new mediaUrl
 {
      shortUrl = (string)user["url"],
      longUrl = (string)user["expanded_url"],
      url = (string)user["media_url"],
      start = user["indices"][0].ToString(),
      end = user["indices"][1].ToString(),
      mediaType = (string)user["type"],
  }).ToList()

Same code work for Entities/URL, Hashtags and mentions but not for Media.

Also tried this -> Get JSON object node but still getting null reference exception.

halfer
  • 19,824
  • 17
  • 99
  • 186
Nilay Shah
  • 67
  • 7

2 Answers2

0

In first tweet, entities object doesn't have media property, so when evaluating first tweet, your code would be equivalent to :

 MediaUrl = (from user in (IEnumerable<JToken>)null
 select new mediaUrl
 {
      shortUrl = (string)user["url"],
      longUrl = (string)user["expanded_url"],
      url = (string)user["media_url"],
      start = user["indices"][0].ToString(),
      end = user["indices"][1].ToString(),
      mediaType = (string)user["type"],
  }).ToList()

which will throw ArgumentNullException because that code does query on null reference collection.

Khairuddin Ni'am
  • 823
  • 1
  • 8
  • 13
  • Still i am not getting. If I try with null it will return me ArgumentNullException and also it wont work with second tweet as well. I mean for second tweet how to pass Media. – Nilay Shah Feb 13 '12 at 05:12
  • The problem is in the first tweet, **not** the second tweet, which cause your code to throw null reference exception. It is because in the first tweet, entities `object` doesn't have `media` property so `tweet["entities"]["media"]` will return `null` **not** empty collection. Try to test it by removing the first tweet from json. Your code won't throw exception. – Khairuddin Ni'am Feb 13 '12 at 05:31
  • yes if i remove first one then works. but my problem is from twitter, i receive this kind of tweets only. – Nilay Shah Feb 15 '12 at 15:48
0

Finally got working. Not appropriate solution but works for me.

I created separate method for parsing Media. Passed Entity as string and in that method i checked is EntityString.Contains Media or not. If yes, then parse media json else returned null. See below Snippet.

        if (Entities != string.Empty)
        {
            if (Entities.Contains("\"media\":"))
            {
                JObject searchResult = JObject.Parse(Entities);
                returnMedia = (from user in searchResult["media"]
                               select new mediaUrl
                               {
                                   shortUrl = (string)user["url"],
                                   longUrl = (string)user["expanded_url"],
                                   url = (string)user["media_url"],
                                   start = user["indices"][0].ToString(),
                                   end = user["indices"][1].ToString(),
                                   mediaType = (string)user["type"],
                               }).ToList();
            }
        }

This works for me. If you have any better solution then Please let me know.

Nilay Shah
  • 67
  • 7