首页 文章

如何解决com.google.gson.JsonException:java IllegalStateException:预期BEGIN_OBJECT但是第1行的字符串为coulmn 10

提问于
浏览
0

我从一个引用的网站获取此代码,以获取列表中的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

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

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

    2)异常即将发生,因为API密钥和API密钥未被替换,因此根据上面的logcat输出它在Line-70失败: -

    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字符串 -

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

    它返回的字符串 Forbidden 不是有效的JSON格式 .

    理想情况下,你需要在异常中处理这种情况,而不是简单地在下面的代码片段中吃异常,这是一种不好的做法 .

    catch (IllegalStateException ex) {
            }
    

相关问题