Reputation: 121
In my application my back end is PHP,i'm getting values in the form of JSON,i'm hitting some xyz url and it gives some JSON objects for example say 10 Json objects(ie. from 0 to 10 Json objects),and i'm having load_more button when user pressed that button then same xyz url will be hit and get another 10 objects(ie. from 10 to 20 Json objects), now the problem is for the first time it takes all the values in a single Json object but if i hit second time it not taking all the values in a single Json object even though the values is available,and it saying No such values found
Here is my Asynctask
class MyTask extends AsyncTask<String, Void, String> {
ProgressDialog pDialog;
@Override
protected void onPreExecute() {
super.onPreExecute();
pDialog = new ProgressDialog(Gropinion_Questions.this);
pDialog.setMessage("Loading...");
pDialog.setCancelable(false);
try {
pDialog.show();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
@Override
protected String doInBackground(String... params) {
return Utils.getJSONString(params[0]);
}
@Override
protected void onPostExecute(String result) {
super.onPostExecute(result);
if (null == result || result.length() == 0) {
showToast("No data found from web!!!");
Gropinion_Questions.this.finish();
} else {
// get JSON result and give to JsonObject
try {
JSONObject mainJson = new JSONObject(result);
System.out.println("result........."+result);
JSONArray jsonArray = mainJson.getJSONArray(ARRAY_NAME);
System.out.println("@@@@@@@@@@ jsonArray @@@@@@@@@@@ "+jsonArray.length());
Singleton.jsonArray = jsonArray;
for (int i = 0; i < 10; i++) {
JSONObject objJson = jsonArray.getJSONObject(i);
objItem = new QuestionsObject();
objItem.setDbcsFacebookProfile(objJson.optString(dbcsFacebookProfile));
objItem.setAvatar_img(objJson.optString(Avatar_image));
objItem.setVotebar(objJson.optString(percentagenumber));
objItem.setProfile_picture_value(objJson.optString(PROFILE_PIC_VALUE));
objItem.setId(objJson.optString(ID));
objItem.setTitle(objJson.optString(TITLE));
objItem.setNick_name(objJson.optString(NICKNAME));
objItem.setQues_type(objJson.optString(QUESTIONTYPE));
objItem.setCategories(objJson.getString(CATEGORIES));
objItem.setSubcatid(objJson.getString(SUBCATID));
objItem.setTotal_vote(objJson.getString(TV));
arrayOfList.add(objItem);
}
} catch (JSONException e) {
e.printStackTrace();
}
setAdapterToListview();
if (null != pDialog && pDialog.isShowing()) {
try {
pDialog.dismiss();
pDialog = null;
} catch (Exception e) {
}
}
}
}
}
Here is my first Json response
{
"questions": [
{
"ID": "4260",
"unique_que": "N2pJS",
"Title": "Which actress looks more beautiful?",
"NickName": "shon17",
"Avatar": "0",
"dbcsFacebookProfile": "0",
"QuestionType": "1",
"Categories": "Shopping & Fashion",
"SubCategoryID": "5",
"Hash": "531ff16d876fe",
"Ext": "jpg",
"avragequestionrate": "0",
"progressBar": "0, 0, 0, 0",
"TotalVote": "0",
"productImage": "531ff16d876fe.jpg,531ff16d89841.jpg,,",
"description": "Katrina,kareena,,",
"productThumbImage": "531ff16d876fe_thumb_75_75.png,531ff16d89841_thumb_75_75.png,,",
"avatarImage": "1258602873_avatar_75_75.jpg",
"Default_image_status": "1",
"voteBar": "0, 531ff16d876fe.jpg, 531ff16d876fe_thumb_75_75.png"
}
Here is my second Json response
{
"questions": [
{
"ID": "4232",
"unique_que": "b6h4a",
"Title": "which actress do u like more?",
"NickName": "shon17",
"Avatar": "0",
"dbcsFacebookProfile": "0",
"QuestionType": "1",
"Categories": "Shopping & Fashion",
"SubCategoryID": "5",
"Hash": "531eb4fdc0dd3",
"Ext": "jpg",
"avragequestionrate": "0",
"progressBar": "33, 1, 66, 2, 0, 0, 0, 0, 3",
"TotalVote": "3",
"productImage": "531eb4fdc0dd3.jpg,531eb4fdc2c4c.jpg,,",
"description": "katrina,deepika,,"
}
This is how i'm getting as a response but when i hit this in browser that time it showing all the fields for load_more but in response it not fetching
I made change from getstring to optstring now it saying different exceotion
Here is my exeption
03-12 06:09:03.705: W/System.err(1408): org.json.JSONException: Index 7 out of range [0..7)
03-12 06:09:03.705: W/System.err(1408): at org.json.JSONArray.get(JSONArray.java:263)
03-12 06:09:03.705: W/System.err(1408): at org.json.JSONArray.getJSONObject(JSONArray.java:480)
03-12 06:09:03.705: W/System.err(1408): at com.android.groupinion.Gropinion_Questions$MyTask.onPostExecute(Gropinion_Questions.java:1041)
03-12 06:09:03.705: W/System.err(1408): at com.android.groupinion.Gropinion_Questions$MyTask.onPostExecute(Gropinion_Questions.java:1)
03-12 06:09:03.705: W/System.err(1408): at android.os.AsyncTask.finish(AsyncTask.java:631)
03-12 06:09:03.705: W/System.err(1408): at android.os.AsyncTask.access$600(AsyncTask.java:177)
03-12 06:09:03.705: W/System.err(1408): at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:644)
03-12 06:09:03.705: W/System.err(1408): at android.os.Handler.dispatchMessage(Handler.java:99)
03-12 06:09:03.705: W/System.err(1408): at android.os.Looper.loop(Looper.java:137)
03-12 06:09:03.705: W/System.err(1408): at android.app.ActivityThread.main(ActivityThread.java:4745)
03-12 06:09:03.705: W/System.err(1408): at java.lang.reflect.Method.invokeNative(Native Method)
03-12 06:09:03.705: W/System.err(1408): at java.lang.reflect.Method.invoke(Method.java:511)
03-12 06:09:03.705: W/System.err(1408): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786)
03-12 06:09:03.705: W/System.err(1408): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
03-12 06:09:03.705: W/System.err(1408): at dalvik.system.NativeStart.main(Native Method)
Upvotes: 0
Views: 449
Reputation: 7087
Please update you code by this for loop:
for (int i = 0; i < 10; i++) {
JSONObject objJson = jsonArray.getJSONObject(i);
objItem = new QuestionsObject();
objItem.setDbcsFacebookProfile(objJson.optString(dbcsFacebookProfile));
objItem.setAvatar_img(objJson.optString(Avatar_image));
objItem.setVotebar(objJson.optString(percentagenumber));
objItem.setProfile_picture_value(objJson.optString(PROFILE_PIC_VALUE));
objItem.setId(objJson.optString(ID));
objItem.setTitle(objJson.optString(TITLE));
objItem.setNick_name(objJson.optString(NICKNAME));
objItem.setQues_type(objJson.optString(QUESTIONTYPE));
objItem.setCategories(objJson.getString(CATEGORIES));
objItem.setSubcatid(objJson.getString(SUBCATID));
if(objJson.has(TV)){
objItem.setTotal_vote(objJson.getString(TV));
}
arrayOfList.add(objItem);
}
Upvotes: 0
Reputation: 8745
As I understood you. You have an exception if there is no value with key you pass to get method.
So you can use optJSONArray to get array, and opt (like optString, optJSONObject, etc.) methods to get other values. These methods does not throw exception, they just returns null if there are no values with key you passed.
You getting your exception because json array length is less than 10 so it is better to use method length() of JSONArray object instead of number 10 in for.
Something like this:
for (int i = 0; i < jsonArray.length(); i++) {
JSONObject objJson = jsonArray.getJSONObject(i);
objItem = new QuestionsObject();
objItem.setDbcsFacebookProfile(objJson.optString(dbcsFacebookProfile));
objItem.setAvatar_img(objJson.optString(Avatar_image));
objItem.setVotebar(objJson.optString(percentagenumber));
objItem.setProfile_picture_value(objJson.optString(PROFILE_PIC_VALUE));
objItem.setId(objJson.optString(ID));
objItem.setTitle(objJson.optString(TITLE));
objItem.setNick_name(objJson.optString(NICKNAME));
objItem.setQues_type(objJson.optString(QUESTIONTYPE));
objItem.setCategories(objJson.getString(CATEGORIES));
objItem.setSubcatid(objJson.getString(SUBCATID));
objItem.setTotal_vote(objJson.getString(TV));
arrayOfList.add(objItem);
}
Upvotes: 1
Reputation: 24853
Try this..
Your doing all correct except following three
objItem.setCategories(objJson.getString(CATEGORIES));
objItem.setSubcatid(objJson.getString(SUBCATID));
objItem.setTotal_vote(objJson.getString(TV));
Change it getString
as optString
objItem.setCategories(objJson.optString(CATEGORIES));
objItem.setSubcatid(objJson.optString(SUBCATID));
objItem.setTotal_vote(objJson.optString(TV));
Or
if(objJson.has(CATEGORIES))
objItem.setCategories(objJson.getString(CATEGORIES));
if(objJson.has(SUBCATID))
objItem.setSubcatid(objJson.getString(SUBCATID));
if(objJson.has(TV))
objItem.setTotal_vote(objJson.getString(TV));
EDIT
Change your for as like below you have specify that 10 but jsonArray length is only 7 that's error Index out of range
for (int i = 0; i < jsonArray.length(); i++) {
Upvotes: 0