Java 解析Twitter API 1.1 JSON
我一直在开发一个Twitter阅读器(只读)(OAuth2.0)的开源代码,它从用户时间轴中提取JSON。它成功地从TwitterAPI 1.1中提取JSON。我面临的挑战是将JSON转换成用户友好的东西。我已经实现了另一个源代码的部分,重点是解析JSON,但我对解析JSON不太熟悉。这是拼凑的,所以我知道我可能忽略了一些东西。可能是冗余或缺少部分 更新: 当我运行应用程序时,它没有崩溃,只是停留在“获取令牌!”。我希望显示的是一个tweet列表,它的格式有点像tweet。我相信这是主要的活动,但我可能错了。您需要一个使用者密钥和密码进行测试。我会把我现在拥有的东西拿出来,但如果有人知道我如何摆脱这个循环,我会感谢你的投入 谢谢 MainActivity.javaJava 解析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。我相信这是主要的活动,
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();
}