我从一个引用的网站获取此代码,以获取列表中的Twitter提要,但我收到如上所述的JsonException错误,请在解决错误时需要一些帮助
public class TwitterAPI {
private String twitterApiKey;
private String twitterAPISecret;
final static String TWITTER_TOKEN_URL =
"https://api.twitter.com/oauth2/token";
final static String TWITTER_STREAM_URL =
"https://api.twitter.com/1.1/statuses/user_timeline.json?screen_name=";
public TwitterAPI(String twitterAPIKey, String twitterApiSecret) {
this.twitterApiKey = twitterAPIKey;
this.twitterAPISecret = twitterApiSecret;
}
public ArrayList<TwitterTweet> getTwitterTweets(String screenName) {
ArrayList<TwitterTweet> twitterTweetArrayList = null;
try {
String twitterUrlApiKey = URLEncoder.encode(twitterApiKey, "UTF-8");
String twitterUrlApiSecret = URLEncoder.encode(twitterAPISecret,
"UTF-8");
String twitterKeySecret = twitterUrlApiKey + ":" +
twitterUrlApiSecret;
String twitterKeyBase64 =
Base64.encodeToString(twitterKeySecret.getBytes(), Base64.NO_WRAP);
TwitterAuthToken twitterAuthToken =
getTwitterAuthToken(twitterKeyBase64);
twitterTweetArrayList = getTwitterTweets(screenName,
twitterAuthToken);
} catch (UnsupportedEncodingException ex) {
} catch (IllegalStateException ex1) {
}
return twitterTweetArrayList;
}
public ArrayList<TwitterTweet> getTwitterTweets(String screenName,
TwitterAuthToken twitterAuthToken) {
ArrayList<TwitterTweet> twitterTweetArrayList = null;
if (twitterAuthToken != null &&
twitterAuthToken.token_type.equals("bearer")) {
HttpGet httpGet = new HttpGet(TWITTER_STREAM_URL + screenName);
httpGet.setHeader("Authorization", "Bearer " +
twitterAuthToken.access_token);
httpGet.setHeader("Content-Type", "application/json");
HttpUtil httpUtil = new HttpUtil();
String twitterTweets = httpUtil.getHttpResponse(httpGet);
twitterTweetArrayList = convertJsonToTwitterTweet(twitterTweets);
}
return twitterTweetArrayList;
}
public TwitterAuthToken getTwitterAuthToken(String twitterKeyBase64) throws
UnsupportedEncodingException {
HttpPost httpPost = new HttpPost(TWITTER_TOKEN_URL);
httpPost.setHeader("Authorization", "Basic " + twitterKeyBase64);
httpPost.setHeader("Content-Type", "application/x-www-form-
urlencoded;charset=UTF-8");
httpPost.setEntity(new StringEntity("grant_type=client_credentials"));
HttpUtil httpUtil = new HttpUtil();
String twitterJsonResponse = httpUtil.getHttpResponse(httpPost);
return convertJsonToTwitterAuthToken(twitterJsonResponse);
}
private TwitterAuthToken convertJsonToTwitterAuthToken(String jsonAuth) {
TwitterAuthToken twitterAuthToken = null;
if (jsonAuth != null && jsonAuth.length() > 0) {
try {
Gson gson = new Gson();
twitterAuthToken = gson.fromJson(jsonAuth,
TwitterAuthToken.class);
} catch (IllegalStateException ex) {
}
}
return twitterAuthToken;
}
private ArrayList<TwitterTweet> convertJsonToTwitterTweet(String
twitterTweets) {
ArrayList<TwitterTweet> twitterTweetArrayList = null;
if (twitterTweets != null && twitterTweets.length() > 0) {
try {
Gson gson = new Gson();
twitterTweetArrayList = gson.fromJson(twitterTweets, new
TypeToken<ArrayList<TwitterTweet>>() {
}.getType());
} catch (IllegalStateException e) {
}
}
return twitterTweetArrayList;
}
private class TwitterAuthToken {
String token_type;
String access_token;
}
LogCat:
02-12 12:10:27.684:E / AndroidRuntime(30448):FATAL EXCEPTION:AsyncTask#1 02-12 12:10:27.684:E / AndroidRuntime(30448):java.lang.RuntimeException:执行时发生错误doInBackground()02-12 12:10:27.684:E / AndroidRuntime(30448):在android.os.AsyncTask $ 3.done(AsyncTask.java:299)02-12 12:10:27.684:E / AndroidRuntime(30448) :at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:352)02-12 12:10:27.684:E / AndroidRuntime(30448):at java.util.concurrent.FutureTask.setException(FutureTask.java:219 )02-12 12:10:27.684:E / AndroidRuntime(30448):at java.util.concurrent.FutureTask.run(FutureTask.java:239)02-12 12:10:27.684:E / AndroidRuntime(30448):在android.os.AsyncTask $ SerialExecutor $ 1.run(AsyncTask.java:230)02-12 12:10:27.684:E / AndroidRuntime(30448):at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1080 )02-12 12:10:27.684:E / AndroidRuntime(30448):at java.util.concurrent.ThreadPoolExecutor $ Worker.run(ThreadPoolExecutor.java:573)0 2-12 12:10:27.684:E / AndroidRuntime(30448):at java.lang.Thread.run(Thread.java:864)02-12 12:10:27.684:E / AndroidRuntime(30448):引起: com.google.gson.JsonSyntaxException:java.lang.IllegalStateException:预期为BEGIN_OBJECT,但在第1行第10 02-12 12:10:27.684:E / AndroidRuntime(30448):在com.google.gson.internal.bind处为STRING .ReflectiveTypeAdapterFactory $ Adapter.read(ReflectiveTypeAdapterFactory.java:180)02-12 12:10:27.684:E / AndroidRuntime(30448):at com.google.gson.Gson.fromJson(Gson.java:755)02-12 12 :10:27.684:E / AndroidRuntime(30448):在com.google.gson.Gson.fromJson(Gson.java:721)02-12 12:10:27.684:E / AndroidRuntime(30448):在com.google . gson.Gson.fromJson(Gson.java:670)02-12 12:10:27.684:E / AndroidRuntime(30448):at com.google.gson.Gson.fromJson(Gson.java:642)02-12 12: 10:27.684:E / AndroidRuntime(30448):at com.app.movie_name_rating.TwitterAPI.convertJsonToTwitterAuthToken(TwitterAPI.java:70)02-12 12:10:27.684:E / AndroidRuntime(30448):at com.app.movie_name _rating.TwitterAPI.getTwitterAuthToken(TwitterAPI.java:62)02-12 12:10:27.684:E / AndroidRuntime(30448):at com.app.movie_name_rating.TwitterAPI.getTwitterTweets(TwitterAPI.java:34)02-12 12: 10:27.684:E / AndroidRuntime(30448):at com.app.movie_name_rating.TwitterAsyncTask.doInBackground(TwitterAsyncTask.java:22)02-12 12:10:27.684:E / AndroidRuntime(30448):at com.app.movie_name_rating .TwitterAsyncTask.doInBackground(TwitterAsyncTask.java:1)02-12 12:10:27.684:E / AndroidRuntime(30448):at android.os.AsyncTask $ 2.call(AsyncTask.java:287)02-12 12:10: 27.684:E / AndroidRuntime(30448):at java.util.concurrent.FutureTask.run(FutureTask.java:234)02-12 12:10:27.684:E / AndroidRuntime(30448):... 4 more 02-12 12:10:27.684:E / AndroidRuntime(30448):引起:java.lang.IllegalStateException:预期BEGIN_OBJECT但是在第1行的第2列第10-12-12 12:10:27.684:E / AndroidRuntime(30448):at com .google.gson.stream.JsonReader.expect(JsonReader.java:339)02-12 12:10:27.684:E / AndroidRuntime(30448) :at com.google.gson.stream.JsonReader.beginObject(JsonReader.java:322)02-12 12:10:27.684:E / AndroidRuntime(30448):at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory $ Adapter .read(ReflectiveTypeAdapterFactory.java:168)02-12 12:10:27.684:E / AndroidRuntime(30448):... 15更多
1 回答
如果有人仍在寻找解决方案,那么它是:
1)首先,最重要的是用你自己生成的API密钥替换API密钥和API密钥 .
2)异常即将发生,因为API密钥和API密钥未被替换,因此根据上面的logcat输出它在Line-70失败: -
而不是以下面的格式返回具有有效访问令牌的有效JSON字符串 -
它返回的字符串
Forbidden
不是有效的JSON格式 .理想情况下,你需要在异常中处理这种情况,而不是简单地在下面的代码片段中吃异常,这是一种不好的做法 .