2015-02-12 72 views
0

我从一个引用的站点获取此代码以获取列表中的Twitter提要,但我得到一个错误JsonException以上 提到请需要一些帮助,在解决错误如何解决com.google.gson.JsonException异常:java IllegalStateException:期望BEGIN_OBJECT,但是在第1行的字符串coulmn 10

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:

12月2日至12日:10:27.684:E/AndroidRuntime(30448):致命异常: 的AsyncTask# 1 02-12 12:10:27.684:E/AndroidRuntime(30448): java.lang.RuntimeException:执行时发生错误 doInBackground()02-12 12:10:27.684:E/AndroidRuntime(30448):at 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):at 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) 02-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,但STRING在第1行10 02-12 12: 10:27.684:E/AndroidRuntime(30448):在 com.google.gson.internal.bind.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 ):at com.google.gson.Gson.fromJson(Gson.java:721)02-12 12:10:27.684: E/AndroidRuntime(30448):at 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.movi​​e_name_rating.TwitterAPI.convertJsonToTwitterAuthToken(TwitterAPI.java:70) 02-12 12:10:27.684:E/AndroidRuntime(30448):at com.app.movi​​e_name_rating。 TwitterAPI.getTwitterAuthToken(TwitterAPI。 java:62) 02-12 12:10:27.684:E/AndroidRuntime(30448):at com.app.movi​​e_name_rating.TwitterAPI.getTwitterTweets(TwitterAPI.java:34) 02-12 12:10:27.684:E/AndroidRuntime(30448):at com.app.movi​​e_name_rating.TwitterAsyncTask.doInBackground(TwitterAsyncTask.java:22)02-12 12:10:27.684:E/AndroidRuntime(30448):at com.app.movi​​e_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更多02 -12 12:10:27。684: E/AndroidRuntime(30448):java.lang.IllegalStateException:致 预期BEGIN_OBJECT但STRING位于第1行的列10月2日至十二日 12:10:27.684:E/AndroidRuntime(30448):在 COM .google.gson.stream.JsonReader.expect(JsonReader.java:339)02-12 12:10:27.684:E/AndroidRuntime(30448):在 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更

+0

首先记录你的回答,并检查你是否得到正确的价值。 – 2015-02-12 07:08:42

+0

我写了一个解决这个问题的方法。 这里见我的帖子:http://stackoverflow.com/a/31604097/2749361 – 2015-07-24 07:59:17

回答

1

如果有人仍然在寻找解决方案,它是:

1)首先和最重要的是用您自己生成的API密钥和API密钥替换。

2)异常来,因为API密钥和API的秘密不会被替换,因此它是在70线 - 按照上面的logcat的输出故障: -

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 

而不是返回一个有效JSON字符串格式有效的访问令牌below--

{"token_type":"bearer","access_token":"AAAAAAAAAAAAAAAAAAAAANOmuQAAAAAAeIchMrbQdzP09sNyZYAtJQsLZ3k%3DhZuwbNpKTgHdvbhLS7ud3EdIUxz7iqZQyoAL4JhpBSf5tgEnTC"} 

它返回一个字符串Forbidden这不是有效的JSON格式。

所以非常需要处理,而不是简单地吃下面的代码块这是一个不好的做法外,这个情况例外。

catch (IllegalStateException ex) { 
     } 
相关问题