Java 解析Twitter API 1.1 JSON

Java 解析Twitter API 1.1 JSON,java,android,json,parsing,twitter,Java,Android,Json,Parsing,Twitter,我一直在开发一个Twitter阅读器(只读)(OAuth2.0)的开源代码,它从用户时间轴中提取JSON。它成功地从TwitterAPI 1.1中提取JSON。我面临的挑战是将JSON转换成用户友好的东西。我已经实现了另一个源代码的部分,重点是解析JSON,但我对解析JSON不太熟悉。这是拼凑的,所以我知道我可能忽略了一些东西。可能是冗余或缺少部分 更新: 当我运行应用程序时,它没有崩溃,只是停留在“获取令牌!”。我希望显示的是一个tweet列表,它的格式有点像tweet。我相信这是主要的活动,

我一直在开发一个Twitter阅读器(只读)(OAuth2.0)的开源代码,它从用户时间轴中提取JSON。它成功地从TwitterAPI 1.1中提取JSON。我面临的挑战是将JSON转换成用户友好的东西。我已经实现了另一个源代码的部分,重点是解析JSON,但我对解析JSON不太熟悉。这是拼凑的,所以我知道我可能忽略了一些东西。可能是冗余或缺少部分

更新: 当我运行应用程序时,它没有崩溃,只是停留在“获取令牌!”。我希望显示的是一个tweet列表,它的格式有点像tweet。我相信这是主要的活动,但我可能错了。您需要一个使用者密钥和密码进行测试。我会把我现在拥有的东西拿出来,但如果有人知道我如何摆脱这个循环,我会感谢你的投入

谢谢

MainActivity.java

package com.example.readtwitterfeed;


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

import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.ClientProtocolException;
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.JSONObject;
import org.json.simple.JSONArray;
import org.json.simple.JSONValue;

import android.os.AsyncTask;
import android.os.Bundle;
import android.app.Activity;
import android.util.Base64;
import android.util.Log;
import android.widget.TextView;

import com.example.readtwitterfeed.R;

public class MainActivity extends Activity {

// CONSUMER API KEY - 21 characters (go here to get one: https://dev.twitter.com/apps/)
// **** CHANGE THIS ****
static final String twitterAPIKEY = "@@@@@@@@@@@@@@@@";

// CONSUMER SECRET  - 41 characters (go here to get one: https://dev.twitter.com/apps/)
// **** CHANGE THIS ****
static final String twitterAPISECRET = "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@";

static final String twitterAPIurl = "https://api.twitter.com/1.1/statuses/user_timeline.json?screen_name=";

// Twitter 'Screen Name'
// **** CHANGE THIS ****
static final String screenName = "Insert_Username_Here";

// Tweets to return
// **** CHANGE THIS, if needed ****
static final int tweets2Return = 1;

// Final URL will look like this (@ is your sreen name/return tweets):
// https://api.twitter.com/1.1/statuses/user_timeline.json?screen_name=@@@&include_rts=1&count=@
static String tweeterURL = twitterAPIurl + screenName
        + "&include_rts=1&count=" + tweets2Return;

static String twitterToken = null;
static String jsonTokenStream = null;
static String jsonFeed = null;
static String tweetJSON = null;

TextView twitterText;

// ////////////////////////////////////
// onCreate - Let's get the GUI going
// ////////////////////////////////////
@Override
protected void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    twitterText = (TextView) findViewById(R.id.tweetFeed);

    // Call first AsyncTask
    new loadTwitterToken().execute();
}

// ////////////////////////////////////////////////////////////////////
// AsyncTask - First, let's get our Token for oAuth (from Twitter)
// If you need oAuth help: https://dev.twitter.com/docs/auth/oauth/faq/
// ////////////////////////////////////////////////////////////////////
protected class loadTwitterToken extends AsyncTask<Void, Void, Integer> {

    @Override
    protected Integer doInBackground(Void... params) {

        //As of this writing, Twitter says, "We do not currently expire access tokens."

        try {
            DefaultHttpClient httpclient = new DefaultHttpClient(
                    new BasicHttpParams());
            HttpPost httppost = new HttpPost(
                    "https://api.twitter.com/oauth2/token");

            String apiString = twitterAPIKEY + ":" + twitterAPISECRET;
            String authorization = "Basic "
                    + Base64.encodeToString(apiString.getBytes(),
                            Base64.NO_WRAP);

            httppost.setHeader("Authorization", authorization);
            httppost.setHeader("Content-Type",
                    "application/x-www-form-urlencoded;charset=UTF-8");
            httppost.setEntity(new StringEntity(
                    "grant_type=client_credentials"));

            InputStream inputStream = null;
            // Let's send to web
            HttpResponse response = httpclient.execute(httppost);
            HttpEntity entity = response.getEntity();
            // Our response
            inputStream = entity.getContent();
            BufferedReader reader = new BufferedReader(
                    new InputStreamReader(inputStream, "UTF-8"), 8);
            StringBuilder sb = new StringBuilder();

            String line = null;

            // Will look like this:
            // {"token_type":"bearer","access_token":"AAAAAAAAAAAAAAAAAAAAABiQTgAAAAAACGie2o%2Bm7jNnxw8txVG99c1wAU8%3DmZq7qrX8JZpDFrgYyh5gLtOkJhQ7BvPD6bZ0ssitjg"}

            while ((line = reader.readLine()) != null) {
                sb.append(line + "\n");
            }

            jsonTokenStream = sb.toString();

            // onPostExecute likes to get a parameter passed to work right.
            // Just passing something.
            return 1;
        } catch (Exception e) {
            Log.e("loadTwitterToken",
                    "doInBackground Error:" + e.getMessage());
            return null;
        }
    }

    @Override
    protected void onPostExecute(Integer result) {

        // Extract Token from JSON stream
        try {
            JSONObject root = new JSONObject(jsonTokenStream);
            twitterToken = root.getString("access_token");
        } catch (Exception e) {
            Log.e("loadTwitterToken", "onPost Error:" + e.getMessage());
        }

        twitterText.setText("Got Token!");
        // Now that we have a oAuth Token, lets get our JSON feed from twitter.
        // We call it from here to make sure the Token has been received already.
        new loadTwitterFeed().execute();
    }
}

// ///////////////////////////////////////////////////////////
// AsyncTask - Download Twitter Feed w/Token as authorization
// //////////////////////////////////////////////////////////

protected class loadTwitterFeed extends AsyncTask<Void, Void, Integer> {

    @Override
    protected Integer doInBackground(Void... params) {
        BufferedReader reader =null;
         try{
            DefaultHttpClient httpclient = new DefaultHttpClient(
                    new BasicHttpParams());
            HttpGet httpget = new HttpGet(tweeterURL);
            httpget.setHeader("Authorization", "Bearer " + twitterToken);
            httpget.setHeader("Content-type", "application/json");

            InputStream inputStream = null;
            HttpResponse response = httpclient.execute(httpget);
            HttpEntity entity = response.getEntity();

            inputStream = entity.getContent();
            reader = new BufferedReader(
                    new InputStreamReader(inputStream, "UTF-8"), 8);
            return null;
         } catch (ClientProtocolException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

    finally{
        if (reader != null)
            try {
                reader.close();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
    }
        return null;

    }

         protected void onPostExecute(String result) {

            StringBuilder sb = new StringBuilder();
            try{
            JSONObject resultObject = new JSONObject(result);
            org.json.JSONArray tweetArray = resultObject.getJSONArray("results");
            for (int t=0; t<tweetArray.length(); t++) {
                JSONObject tweetObject = tweetArray.getJSONObject(t);
                sb.append(tweetObject.getString("from_user")+": ");
                sb.append(tweetObject.get("text")+"\n\n");
            }
            }
            catch (Exception e) {
                Log.e("Tweet", "Error retrieving JSON stream" + e.getMessage());
                jsonFeed = sb.toString();
                e.printStackTrace();
            }   

             }
        }
            /*String line = null;
            while ((line = reader.readLine()) != null) {
                sb.append(line + "\n");
            }*/



    protected void onPostExecute(Integer result) {
        // Update GUI
        if (jsonFeed.length() > 0) {
            twitterText.setText(jsonFeed);
        } else {
             //I'd assume wrong Consumer Key/Secret if this happens.
            twitterText.setText("Nothing Returned");
        }       
    }
}
package com.example.readtwitterfeed;
导入java.io.BufferedReader;
导入java.io.IOException;
导入java.io.InputStream;
导入java.io.InputStreamReader;
导入java.io.Reader;
导入org.apache.http.HttpEntity;
导入org.apache.http.HttpResponse;
导入org.apache.http.client.ClientProtocolException;
导入org.apache.http.client.methods.HttpGet;
导入org.apache.http.client.methods.HttpPost;
导入org.apache.http.entity.StringEntity;
导入org.apache.http.impl.client.DefaultHttpClient;
导入org.apache.http.params.BasicHttpParams;
导入org.json.JSONObject;
导入org.json.simple.JSONArray;
导入org.json.simple.JSONValue;
导入android.os.AsyncTask;
导入android.os.Bundle;
导入android.app.Activity;
导入android.util.Base64;
导入android.util.Log;
导入android.widget.TextView;
导入com.example.readtwitterfeed.R;
公共类MainActivity扩展了活动{
//消费者API密钥-21个字符(转到此处获取一个:https://dev.twitter.com/apps/)
//****更改此项****
静态最终字符串twitterAPIKEY=“@@@@@@@@@@@@@@@”;
//消费者秘密-41个字符(点击此处获取:https://dev.twitter.com/apps/)
//****更改此项****
静态最终字符串twitterAPISECRET=“@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@”;
静态最终字符串twitterAPIurl=”https://api.twitter.com/1.1/statuses/user_timeline.json?screen_name=";
//Twitter“屏幕名称”
//****更改此项****
静态最终字符串screenName=“在此处插入用户名”;
//返回推文
//****如果需要,请更改此选项****
静态最终int tweets2Return=1;
//最终URL如下所示(@是您的sreen名称/返回tweets):
// https://api.twitter.com/1.1/statuses/user_timeline.json?screen_name=@@@&包含\u rts=1和计数=@
静态字符串tweeterURL=twitterAPIurl+屏幕名
+“&include_rts=1&count=“+tweets2Return;
静态字符串twitterToken=null;
静态字符串jsonTokenStream=null;
静态字符串jsonFeed=null;
静态字符串tweetJSON=null;
文本视图推特文本;
// ////////////////////////////////////
//onCreate—让我们开始GUI
// ////////////////////////////////////
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
twitterText=(TextView)findViewById(R.id.tweetFeed);
//调用第一个异步任务
新建loadTwitterToken().execute();
}
// ////////////////////////////////////////////////////////////////////
//AsyncTask-首先,让我们获取oAuth的令牌(来自Twitter)
//如果您需要oAuth帮助:https://dev.twitter.com/docs/auth/oauth/faq/
// ////////////////////////////////////////////////////////////////////
受保护类loadTwitterToken扩展异步任务{
@凌驾
受保护的整数doInBackground(Void…params){
//在撰写本文时,Twitter表示,“我们目前不会让访问令牌过期。”
试一试{
DefaultHttpClient httpclient=新的DefaultHttpClient(
新的BasicHttpParams());
HttpPost HttpPost=新的HttpPost(
"https://api.twitter.com/oauth2/token");
字符串apitstring=twitterAPIKEY+“:”+twitterAPISECRET;
字符串授权=“基本”
+Base64.encodeToString(apiString.getBytes(),
Base64.无包装);
httppost.setHeader(“授权”,授权);
setHeader(“内容类型”,
“application/x-www-form-urlencoded;charset=UTF-8”);
httppost.setEntity(新的StringEntity(
“授权类型=客户端凭据”);
InputStream InputStream=null;
//让我们发送到web
HttpResponse response=httpclient.execute(httppost);
HttpEntity=response.getEntity();
//我们的反应
inputStream=entity.getContent();
BufferedReader reader=新的BufferedReader(
新的InputStreamReader(inputStream,“UTF-8”),8);
StringBuilder sb=新的StringBuilder();
字符串行=null;
//将如下所示:
//{“令牌类型”:“承载”、“访问令牌”:“aaaaaaaaaaaaaaaaaacgie2o%2BM7JNxW8TXVG99C1WAU8%3DMZQ7QRX8JZPDFRGYH5GLTOKJHQ7BVPD6BZ0SSITJG”}
而((line=reader.readLine())!=null){
sb.追加(第+行“\n”);
}
jsonTokenStream=sb.toString();
//onPostExecute喜欢将参数传递到正确的位置。
//只是传递一些东西。
返回1;
}捕获(例外e){
Log.e(“loadTwitterToken”,
“doInBackground错误:”+e.getMessage());
返回null;
}
}
@凌驾
受保护的void onPostExecute(整数结果){
//从JSON流中提取令牌
试一试{
JSONObject root=新的JSONObject(jsonTokenStream);
twitterToken=root.getString(“访问令牌”);
}捕获(例外e){
<ScrollView  xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">

<TextView
     android:id="@+id/tweetFeed"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="Loading..." />


</ScrollView>
@Override
protected void onPostExecute(Integer result) {

    pd.dismiss();

    // Extract Token from JSON stream
    try {
        JSONObject root = new JSONObject(jsonTokenStream);
        twitterToken = root.getString("access_token");
    } catch (Exception e) {
        Log.e("loadTwitterToken", "onPost Error:" + e.getMessage());
    }

    twitterText.setText("Got Token!");
    // Now that we have a oAuth Token, lets get our JSON feed from twitter.
    // We call it from here to make sure the Token has been received already.
    new loadTwitterFeed().execute();
}