Android JSON中没有这样的值错误
在我的应用程序中,我的后端是PHP,我得到的值是JSON,我点击了一些xyz url,它给出了一些JSON对象,比如说10个JSON对象(即从0到10个JSON对象),当用户按下该按钮时,我有load_more按钮,然后点击同一个xyz url,得到另外10个对象(即10到20个Json对象), 现在的问题是它第一次在一个Json对象中获取所有值,但是如果我第二次点击它,它不会在一个Json对象中获取所有值 即使这些值可用,并且它表示未找到此类值 这是我的任务Android JSON中没有这样的值错误,android,Android,在我的应用程序中,我的后端是PHP,我得到的值是JSON,我点击了一些xyz url,它给出了一些JSON对象,比如说10个JSON对象(即从0到10个JSON对象),当用户按下该按钮时,我有load_more按钮,然后点击同一个xyz url,得到另外10个对象(即10到20个Json对象), 现在的问题是它第一次在一个Json对象中获取所有值,但是如果我第二次点击它,它不会在一个Json对象中获取所有值 即使这些值可用,并且它表示未找到此类值 这是我的任务 class MyTask exte
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) {
}
}
}
}
}
这是我的第二个Json响应
{
"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"
}
{
"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,,"
}
这就是我作为响应得到的结果,但当我在浏览器中点击时,它显示了加载的所有字段,但作为响应,它没有抓取
我将getstring更改为optstring,现在它表示不同的exceotion
这是我的解释
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)
正如我所理解的,若传递给get方法的键并没有值,那个么就有一个异常 因此,您可以使用获取数组和opt(如optString、optJSONObject等)方法来获取其他值。这些方法不会引发异常,如果传递的键没有值,它们只会返回null 因为json数组长度小于10,所以最好使用 方法,而不是中的数字10 大概是这样的:
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);
}
for(int i=0;i
试试这个
除了下面三点之外,你做的一切都是正确的
objItem.setCategories(objJson.getString(CATEGORIES));
objItem.setSubcatid(objJson.getString(SUBCATID));
objItem.setTotal_vote(objJson.getString(TV));
将其更改为optString
objItem.setCategories(objJson.optString(CATEGORIES));
objItem.setSubcatid(objJson.optString(SUBCATID));
objItem.setTotal_vote(objJson.optString(TV));
或
编辑
更改为如下所示,您已指定10,但jsonArray长度仅为7,这是错误索引超出范围
for (int i = 0; i < jsonArray.length(); i++) {
for(int i=0;i
请通过以下for循环更新您的代码:
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);
}
for(int i=0;i<10;i++){
JSONObject objJson=jsonArray.getJSONObject(i);
objItem=新问题对象();
setDbcsFacebookProfile(objJson.optString(dbcsFacebookProfile));
setAvatar_img(objJson.optString(Avatar_image));
setVotebar(objJson.optString(percentagenumber));
setProfile_picture_值(objJson.optString(PROFILE_picu值));
setId(objJson.optString(ID));
setTitle(objJson.optString(TITLE));
objItem.setNick_name(objJson.optString(昵称));
objItem.setQues_类型(objJson.optString(QUESTIONTYPE));
setCategories(objJson.getString(CATEGORIES));
setSubcatid(objJson.getString(SUBCATID));
if(objJson.has(TV)){
objItem.setTotal_vote(objJson.getString(TV));
}
arrayOfList.add(objItem);
}
你能发布你的json是什么样子的吗?还有你的logcat错误。我认为你的问题只是json对象,因为在你的第一个响应中,它包含keyvoteBar
,而在第二个响应中它不包含keyvoteBar
,所以你的问题是,你的问题是,json中没有这样的值错误,因为e您的第一次响应包含您尝试获取的所有密钥,第二次Json对象中缺少一个密钥对值,因此您将获得“Json中没有此类值错误”
。为避免出现此类时间,您需要检查objJson.has(“Youkey”)
对于每个键,或者是可能出现或不出现的键,如果Json对象包含键,则可以使用getString()
Ya这是绝对正确的,但当我在浏览器中点击url时,它会显示所有的值,但在代码中它不会抓取,如果你比较这两个响应,你会发现最后四个参数在第二个响应中不可用。如果我尝试使用getstring,那么我也会遇到同样的问题facing@user3282586使用optString
或使用my s所有getString和optString的第二个编辑选项。@user3282586检查我的编辑。.更改for循环,如for(int i=0;i
也请发布您的日志。如果我看到错误的堆栈跟踪,这将更容易理解。我更改了它,但问题是在第二次响应中缺少一些参数,因此只会出现问题,如果您解决该问题,它将非常完整
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);
}