0

I need to parse twitter user feed and I am trying to make JSON Object from json string. I correctly able to get the json string but when I am trying to make JSON object from it, it is showing an JSONException. This is my trying code.

package com.heath_bar.twitter;

import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;

import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.params.BasicHttpParams;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import android.app.Activity;
import android.os.AsyncTask;
import android.os.Bundle;
import android.util.Base64;
import android.util.Log;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;

public class MainActivity extends Activity {

    final String URL = "https://api.twitter.com/1.1/statuses/user_timeline.json?screen_name=*******";
    final String APIKEY = "***********************";
    final String APISECRET = "*********************";
    final String BearerToken = "AAAAAAAAAAAAAAAAAAAAAMRF***************************";

    JSONObject jsonObj = null;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Button btn_get_feed = (Button) findViewById(R.id.btn_get_feed);
        btn_get_feed.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                String bearer_token = BearerToken;
                new GetFeedTask().execute(bearer_token, URL);
            }
        });
    }

    protected class GetFeedTask extends AsyncTask<String, Void, String> {

        @Override
        protected String doInBackground(String... params) {

            try {
                DefaultHttpClient httpclient = new DefaultHttpClient(
                        new BasicHttpParams());
                HttpGet httpget = new HttpGet(params[1]);
                httpget.setHeader("Authorization", "Bearer " + params[0]);
                httpget.setHeader("Content-type", "application/json");

                InputStream inputStream = null;
                HttpResponse response = httpclient.execute(httpget);
                HttpEntity entity = response.getEntity();
                inputStream = entity.getContent();
                BufferedReader reader = new BufferedReader(new InputStreamReader(
                        inputStream, "iso-8859-1"), 8);
                StringBuilder sb = new StringBuilder();
                String line = null;
                while ((line = reader.readLine()) != null) {
                    sb.append(line + "\n");
                }
                inputStream.close();
                return sb.toString();
            } catch (Exception e) {
                Log.e("GetFeedTask", "Error:" + e.getMessage());
                return null;
            }
        }

        @Override
        protected void onPostExecute(String jsonText) {
            try {
                TextView txt = (TextView) findViewById(R.id.txt_feed);
                txt.setText(jsonText); // this is showing the JSON string

                try {
                    jsonObj = new JSONObject(jsonText);
                    Log.d("status_success", "Successfully created JSON object");
                } catch (JSONException e) {
                    Log.e("JSON Parser", "Error parsing data " + e.toString());
                }
            } catch (Exception e) {
                Log.e("GetFeedTask", "Error:" + e.getMessage());
            }
        }
    }

}
5
  • 2
    It would be easier with the twitter4j library, which wraps the API calls and parses the responses for you. Commented Jul 20, 2013 at 9:10
  • I need to parse today's feed, profile-image, feed created time of 8 users. Can twitter4jprovide more support than doing it manually? Or doing it manually is sufficient? It is to be mentioned that I am using application-only authentication. Commented Jul 20, 2013 at 9:51
  • twitter4j cannot do more, than is possible with the official API, because it is using it. It is just less work. Commented Jul 20, 2013 at 9:57
  • yes I got it. But My app needs read-only feature. The purpose is only to fetch feed, profile image, tweet time of user. My requirement is very low. So should I approach for this library or enough for this time? Commented Jul 20, 2013 at 10:04
  • 1
    I would use the library if starting from scratch. If you already did it manually, you do not need it. Commented Jul 20, 2013 at 10:33

2 Answers 2

1

I need to parse twitter feed.......

Try JSONArray instead of JSONObject.

JSONArray jsonArray = new JSONArray(jsonText);

Twitter REST API 1.1 feed starts with an array node. Sample twitter JSON feed can be found here.

[
  {
    "coordinates": null,
    "favorited": false,
    "truncated": false,
    "created_at": "Wed Aug 29 17:12:58 +0000 2012",
    "id_str": "240859602684612608",
    "entities": {
      "urls": [
        {
          "expanded_url": "https://dev.twitter.com/blog/twitter-certified-products",
          "url": "https://t.co/MjJ8xAnT",
          "indices": [
            52,
            73
          ],
          "display_url": "dev.twitter.com/blog/twitter-c\u2026"
        }
      ],
      "hashtags": [

      ],
      "user_mentions": [

      ]
    },
    "in_reply_to_user_id_str": null,
    "contributors": null,
    "text": "Introducing the Twitter Certified Products Program: https://t.co/MjJ8xAnT",
    "retweet_count": 121,
    "in_reply_to_status_id_str": null,
    "id": 240859602684612608,
    "geo": null,
    "retweeted": false,
    "possibly_sensitive": false,
    "in_reply_to_user_id": null,
    "place": null,
    "user": {
      "profile_sidebar_fill_color": "DDEEF6",
      "profile_sidebar_border_color": "C0DEED",
      "profile_background_tile": false,
      "name": "Twitter API",
      "profile_image_url": "http://a0.twimg.com/profile_images/2284174872/7df3h38zabcvjylnyfe3_normal.png",
      "created_at": "Wed May 23 06:01:13 +0000 2007",
      "location": "San Francisco, CA",
      "follow_request_sent": false,
      "profile_link_color": "0084B4",
      "is_translator": false,
      "id_str": "6253282",
      "entities": {
        "url": {
          "urls": [
            {
              "expanded_url": null,
              "url": "http://dev.twitter.com",
              "indices": [
                0,
                22
              ]
            }
          ]
        },
        "description": {
          "urls": [

          ]
        }
   }
]
Sign up to request clarification or add additional context in comments.

Comments

1

Twitter tweets comes under "text" tag for each JSONObject. Access each json object from json array as follows

ArrayList<String> tweets=new ArrayList<String>();
JSONArray array =new JSONArray(jsonText);
                    for(int i=0;i<array.length();i++){
                        JSONObject obj=array.getJSONObject(i);
                        String text=obj.getString("text");
                        tweets.add(text);
                        ArrayAdapter<String> adapter=new ArrayAdapter<String>(getBaseContext(),android.R.layout.simple_list_item_1,tweets);
                        lv.setAdapter(adapter);// displaying in a listview
                    }

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.