eular eular - 1 month ago 16
JSON Question

Twitter Trends API - org.json.JSONException (Android)

I am trying to fetch Twitter trends but getting JSONException. Searched other similar topics and tried the possible ways but still getting the same exception. I am new to JSON, consuming an API . Probably, I am missing sth simple but just can't see it. Hope, you help me to see it. Thanks in advance.

As Twitter API says "The response is an array of “trend” objects that encode the name of the trending topic...". So, I am trying to get the response as a JSONArray of JSONObjects (trends)..

In the log, I see, I get status code 200. That's what I get :

D/Authorization Class: GET response code: 200
D/Authorization Class: JSON response: [{"trends":[{"name":"#\u0627\u0644\u0627\u062A\u062D\u0627\u062F_\u0627\u0644\u0647\u0644\u0627\u0644","url":"http:\/\/twitter.com\/search?q=%23%D8%A7%D9%84%D8%A7%D8%AA%D8%AD%D8%A7%D8%AF_%D8%A7%D9%84%D9%87%D9%84%D8%A7%D9%84","promoted_content":null,"query":"%23%D8%A7%D9%84%D8%A7%D8%AA%D8%AD%D8%A7%D8%AF_%D8%A7%D9%84%D9%87%D9%84%D8%A7%D9%84","tweet_volume":null},{"name":"#KohLanta","url":"http:\/\/twitter.com\/search?q=%23KohLanta","promoted_content":null,"query":"%23KohLanta","tweet_volume":13188},{"name":"Anthony Weiner","url":"http:\/\/twitter.com\/search?q=%22Anthony+Weiner%22","promoted_content":null,"query":"%22Anthony+Weiner%22","tweet_volume":39739},{"name":"#mitamtour","url":"http:\/\/twitter.com\/search?q=%23mitamtour","promoted_content":null,"query":"%23mitamtour","tweet_volume":21580},{"name":"#HistoriasTerrorEn4Palabras","url":"http:\/\/twitter.com\/search?q=%23HistoriasTerrorEn4Palabras","promoted_content":null,"query":"%23HistoriasTerrorEn4Palabras","tweet_volume":15852},{"name":"#YoTrabajoPorLapatria","url":"http:\/\/twitter.com\/search?q=%23YoTrabajoPorLapatria","promoted_content":null,"query":"%23YoTrabajoPorLapatria","tweet_volume":75066},{"name":"Milagro Sala","url":"http:\/\/twitter.com\/search?q=%22Milagro+Sala%22","promoted_content":null,"query":"%22Milagro+Sala%22","tweet_volume":18934},{"name":"Drake and Taylor Swift","url":"http:\/\/twitter.com\/search?q=%22Drake+and+Taylor+Swift%22","promoted_content":null,"query":"%22Drake+and+Taylor+Swift%22","tweet_volume":47344},{"name":"Cenk Tosun","url":"http:\/\/twitter.com\/search?q=%22Cenk+Tosun%22","promoted_content":null,"query":"%22Cenk+Tosun%22","tweet_volume":null},{"name":"FOCO BELIEBERS","url":"http:\/\/twitter.com\/search?q=%22FOCO+BELIEBERS%22","promoted_content":null,"query":"%22FOCO+BELIEBERS%22","tweet_volume":59554},{"name":"\u062E\u0627\u0644\u062F \u0627\u0644\u0633\u0645\u064A\u0631\u064A","url":"http:\/\/twitter.com\/search?q=%22%D8%AE%D8%A7%D9%84%D8%AF+%D8%A7%D9%84%D8%B3%D9%85%D9%8A%D8%B1%D9%8A%22","promoted_content":null,"query":"%22%D8%AE%D8%A7%D9%84%D8%AF+%D8%A7%D9%84%D8%B3%D9%85%D9%8A%D8%B1%D9%8A%22","tweet_volume":null},{"name":"Ergin Ataman","url":"http:\/\/twitter.com\/search?q=%22Ergin+Ataman%22","promoted_content":null,"query":"%22Ergin+Ataman%22","tweet_volume":null},{"name":"#LOSCPSG","url":"http:\/\/twitter.com\/search?q=%23LOSCPSG","promoted_content":null,"query":"%23LOSCPSG","tweet_volume":12447},{"name":"#NationalChocolateDay","url":"http:\/\/twitter.com\/search?q=%23NationalChocolateDay","promoted_content":null,"query":"%23NationalChocolateDay","tweet_volume":71011},{"name":"#T\u00DCRK\u00FCnBayram\u013129Ekim","url":"http:\/\/twitter.com\/search?q=%23T%C3%9CRK%C3%BCnBayram%C4%B129Ekim","promoted_content":null,"query":"%23T%C3%9CRK%C3%BCnBayram%C4%B129Ekim","tweet_volume":37252},{"name":"#art\u0131kbenimsin","url":"http:\/\/twitter.com\/search?q=%23art%C4%B1kbenimsin","promoted_content":null,"query":"%23art%C4%B1kbenimsin","tweet_volume":73324},{"name":"#BakeOffItalia","url":"http:\/\/twitter.com\/search?q=%23BakeOffItalia","promoted_content":null,"query":"%23BakeOffItalia","tweet_volume":null},{"name":"#\u0632\u062F_\u0631\u0635\u064A\u062F\u0643_13","url":"http:\/\/twitter.com\/search?q=%23%D8%B2%D8%AF_%D8%B1%D8%B5%D9%8A%D8%AF%D9%83_13","promoted_content":null,"query":"%23%D8%B2%D8%AF_%D8%B1%D8%B5%D9%8A%D8%AF%D9%83_13","tweet_volume":20390},{"name":"#ReisBedelliAskerlik\u0130stiyoruz","url":"http:\/\/twitter.com\/search?q=%23ReisBedelliAskerlik%C4%B0stiyoruz","promoted_content":null,"query":"%23ReisBedelliAskerlik%C4%B0stiyoruz","tweet_volume":15625},{"name":"#ViihTubeVoltaProUtero","url":"http:\/\/twitter.com\/search?q=%23ViihTubeVoltaProUtero","promoted_content":null,"query":"%23ViihTubeVoltaProUtero","tweet_volume":91304},{"name":"#tvoh","url":"http:\/\/twitter.com\/search?q=%23tvoh","promoted_content":null,"query":"%23tvoh","tweet_volume":null},{"name":"#ThatsMyGirlProjectTODAY","url":"http:\/\/twitter.com\/search?q=%23ThatsMyGirlProjectTODAY","promoted_conte<code>


Error line is :

E/Authorization Class: GET Error : org.json.JSONException: Value [{"as_of":"2016-10-28T19:57:52Z","trends":[{"query":"%23%D8%A7%D9%84%D8%A7%D8%AA%D8%AD%D8%A7%D8%AF_%D8%A7%D9%84%D9%87%D9%84%D8%A7%D9%84","url":"http:\/\/twitter.com\/search?q=%23%D8%A7%D9%84%D8%A7%D8%AA%D8%AD%D8%A7%D8%AF_%D8%A7%D9%84%D9%87%D9%84%D8%A7%D9%84","tweet_volume":null,"promoted_content":null,"name":"#الاتحاد_الهلال"},{"query":"%23KohLanta","url":"http:\/\/twitter.com\/search?q=%23KohLanta","tweet_volume":13188,"promoted_content":null,"name":"#KohLanta"},{"query":"%22Anthony+Weiner%22","url":"http:\/\/twitter.com\/search?q=%22Anthony+Weiner%22","tweet_volume":39739,"promoted_content":null,"name":"Anthony Weiner"},{"query":"%23mitamtour","url":"http:\/\/twitter.com\/search?q=%23mitamtour","tweet_volume":21580,"promoted_content":null,"name":"#mitamtour"},{"query":"%23HistoriasTerrorEn4Palabras","url":"http:\/\/twitter.com\/search?q=%23HistoriasTerrorEn4Palabras","tweet_volume":15852,"promoted_content":null,"name":"#HistoriasTerrorEn4Palabras"},{"query":"%23YoTrabajoPorLapatria","url":"http:\/\/twitter.com\/search?q=%23YoTrabajoPorLapatria","tweet_volume":75066,"promoted_content":null,"name":"#YoTrabajoPorLapatria"},{"query":"%22Milagro+Sala%22","url":"http:\/\/twitter.com\/search?q=%22Milagro+Sala%22","tweet_volume":18934,"promoted_content":null,"name":"Milagro Sala"},{"query":"%22Drake+and+Taylor+Swift%22","url":"http:\/\/twitter.com\/search?q=%22Drake+and+Taylor+Swift%22","tweet_volume":47344,"promoted_content":null,"name":"Drake and Taylor Swift"},{"query":"%22Cenk+Tosun%22","url":"http:\/\/twitter.com\/search?q=%22Cenk+Tosun%22","tweet_volume":null,"promoted_content":null,"name":"Cenk Tosun"},{"query":"%22FOCO+BELIEBERS%22","url":"http:\/\/twitter.com\/search?q=%22FOCO+BELIEBERS%22","tweet_volume":59554,"promoted_content":null,"name":"FOCO BELIEBERS"},{"query":"%22%D8%AE%D8%A7%D9%84%D8%AF+%D8%A7%D9%84%D8%B3%D9%85%D9%8A%D8%B1%D9%8A%22","url":"http:\/\/twitter.com\/search?q=%22%D8%AE%D8%A7%D9%84%D8%AF+%D8%A7%D9%84%D8%B3%D9%85%D9%8A%D8%B1%D9%8A%22","tweet_volume":null,"promoted_content":null,"name":"خالد السميري"},{"query":"%22Ergin+Ataman%22","url":"http:\/\/twitter.com\/search?q=%22Ergin+Ataman%22","tweet_volume":null,"promoted_content":null,"name":"Ergin Ataman"},{"query":"%23LOSCPSG","url":"http:\/\/twitter.com\/search?q=%23LOSCPSG","tweet_volume":12447,"promoted_content":null,"name":"#LOSCPSG"},{"query":"%23NationalChocolateDay","url":"http:\/\/twitter.com\/search?q=%23NationalChocolateDay","tweet_volume":71011,"promoted_content":null,"name":"#NationalChocolateDay"},{"query":"%23T%C3%9CRK%C3%BCnBayram%C4%B129Ekim","url":"http:\/\/twitter.com\/search?q=%23T%C3%9CRK%C3%BCnBayram%C4%B129Ekim","tweet_volume":37252,"promoted_content":null,"name":"#TÜRKünBayramı29Ekim"},{"query":"%23art%C4%B1kbenimsin","url":"http:\/\/twitter.com\/search?q=%23art%C4%B1kbenimsin","tweet_volume":73324,"promoted_content":null,"name":"#artıkbenimsin"},{"query":"%23BakeOffItalia","url":"http:\/\/twitter.com\/search?q=%23BakeOffItalia","tweet_volume":null,"promoted_content":null,"name":"#BakeOffItalia"},{"query":"%23%D8%B2%D8%AF_%D8%B1%D8%B5%D9%8A%D8%AF%D9%83_13","url":"http:\/\/twitter.com\/search?q=%23%D8%B2%D8%AF_%D8%B1%D8%B5%D9%8A%D8%AF%D9%83_13","tweet_volume":20390,"promoted_content":null,"name":"#زد_رصيدك_13"},{"query":"%23ReisBedelliAskerlik%C4%B0stiyoruz","url":"http:\/\/twitter.com\/search?q=%23ReisBedelliAskerlik%C4%B0stiyoruz","tweet_volume":15625,"promoted_content":null,"name":"#ReisBedelliAskerlikİstiyoruz"},{"query":"%23ViihTubeVoltaProUtero","url":"http:\/\/twitter.com\/search?q=%23ViihTubeVoltaProUtero","tweet_volume":91304,"promoted_content":null,"name":"#ViihTubeVoltaProUtero"},{"query":"%23tvoh","url":"http:\/\/twitter.com\/search?q=%23tvoh","tweet_volume":null,"promoted_content":null,"name":"#tvoh"},{"query":"%23ThatsMyGirlProjectTODAY","url":"http:\/\/twitter.com\/search?q=%23ThatsMyGirlProjectTODAY","tweet_volume":51622,"promoted_content":null,"name":"#ThatsMyGirlProjectTODAY"},{"query":"%23BuenV


Related code block is :

while ((metin = bufferedReader.readLine()) != null){
stringBuilder.append(metin);
}

Log.d(TAG, "GET response code: " + String.valueOf(httpURLConnection.getResponseCode()));
Log.d(TAG, "JSON response: " + stringBuilder.toString());

String response = stringBuilder.toString();

JSONObject jsonResponse = new JSONObject(response);

JSONArray jsonArray = jsonResponse.getJSONArray("trends");
JSONObject jsonObj;


for (int i=0; i < jsonArray.length(); i++){
// jsonSonuc =(JsonObject) jsonDizi.get(i);
Trend trend = new Trend();

jsonObj = jsonArray.getJSONObject(i);
trend.set_trendQuery(jsonObj.getString("query"));
trend.set_trendURL(jsonObj.getString("url"));
trend.set_trendName(jsonObj.getString("name"));

trends.add(i,trend);
}
}
catch(Exception e){
Log.e(TAG, "GET Error : " + Log.getStackTraceString(e));
}
finally {
if (httpURLConnection != null)
httpURLConnection.disconnect();
}


Calling the method in MainActivity in an AsyncTask:

public class BringTheTrendsTask extends AsyncTask<Object, Void, ArrayList<Trend>> {

private ProgressDialog progressDialog;

@Override
protected void onPreExecute(){
super.onPreExecute();
/*progressDialog = new ProgressDialog(MainActivity.this);
progressDialog.setMessage("Loading..!");
progressDialog.setCancelable(false);
progressDialog.show();*/
}

@Override
protected ArrayList<Trend> doInBackground(Object... param) {
if(NetworkControl.haveConnection(MainActivity.this))
return Authorization.getTrends();
else {
Toast.makeText(MainActivity.this, "Connection error", Toast.LENGTH_LONG);
return null;
}
}

@Override
protected void onPostExecute(ArrayList<Trend> trends){
/*
progressDialog.dismiss();
*/
if(trends.isEmpty())
Toast.makeText(MainActivity.this,"ArrayList-Trend blank",Toast.LENGTH_LONG);
else
FillTheListView(trends);
}
}

Answer

You pointed out that the JSON data you receive was something like : [{"trends": ....}]

It's a JSONArray containing a JSONObject that has the trends array :

you did :

JSONObject jsonResponse = new JSONObject(response);
JSONArray jsonArray = jsonResponse.getJSONArray("trends");

but it should be something like :

JSONArray  jsonData = new JSONArray(response);
JSONObject jsonResponse = jsonData.getJSONObject(0);
JSONArray jsonArray = jsonResponse.getJSONArray("trends");

Moreover, it's best to use Gson library to parse that kind of JSON data defined by a specific schema