Android 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

在我的应用程序中,我的后端是PHP,我得到的值是JSON,我点击了一些xyz url,它给出了一些JSON对象,比如说10个JSON对象(即从0到10个JSON对象),当用户按下该按钮时,我有load_more按钮,然后点击同一个xyz url,得到另外10个对象(即10到20个Json对象), 现在的问题是它第一次在一个Json对象中获取所有值,但是如果我第二次点击它,它不会在一个Json对象中获取所有值 即使这些值可用,并且它表示未找到此类值

这是我的任务

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对象,因为在你的第一个响应中,它包含key
voteBar
,而在第二个响应中它不包含key
voteBar
,所以你的问题是,你的问题是,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);
}