如何在android中的另一个数组中迭代json数组

时间:2016-07-16 21:26:54

标签: android json

我遇到了使用网络服务的问题,下面是服务的外观。

[

 {"NND (Megastore \/ Supermarket)":
        [
            {"question":"\"33\" Export (Can)","questionid":"32"},
            {"question":"Ace Roots (Can)","questionid":"33"},
            {"question":"Amstel (Can)","questionid":"34"},
            {"question":"Climax (Can)","questionid":"35"},
            {"question":"Fayrouz (Cann)","questionid":"36"},
            {"question":"Goldberg (RGB)","questionid":"37"},
            {"question":"Gulder (Can)","questionid":"38"},
            {"question":"Gulder  (RGB)","questionid":"39"},
            {"question":"Heineken (Can)","questionid":"40"},
            {"question":"Heineken (RGB)","questionid":"41"},
            {"question":"Legend  (Can)","questionid":"42"},
            {"question":"Maltina   (Can)","questionid":"43"},
            {"question":"Star (Can)","questionid":"44"},
            {"question":"Star (RGB)","questionid":"45"},
            {"question":"Star  Radler (Can)","questionid":"46"},
            {"question":"Strongbow (Can)","questionid":"47"}
        ]
    },

    {"NND (Superette - including returnable)":
        [
            {"question":"\"33\" Export (Can)","questionid":"48"},
            {"question":"Ace Roots (Can)","questionid":"49"},
            {"question":"Amstel (Can)","questionid":"50"},
            {"question":"Climax (Can)","questionid":"51"},
            {"question":"Fayrouz (Cann)","questionid":"52"},
            {"question":"Goldberg (RGB)","questionid":"53"},
            {"question":"Gulder (Can)","questionid":"54"},
            {"question":"Gulder  (RGB)","questionid":"55"},
            {"question":"Heineken (Can)","questionid":"56"},
            {"question":"Heineken (RGB)","questionid":"57"},
            {"question":"Legend  (Can)","questionid":"58"},
            {"question":"Maltina   (Can)","questionid":"59"},
            {"question":"Star (Can)","questionid":"60"},
            {"question":"Star (RGB)","questionid":"61"},
            {"question":"Star  Radler (Can)","questionid":"62"},
            {"question":"Strongbow (Can)","questionid":"63"}
        ]
    },
]

这是HEADER1的声明

private static final String HEADER1 = "NND (Megastore \\/ Supermarket)";

我在android中使用asynctask,下面是我的doInBackgroud代码的样子。

  @Override
    protected String doInBackground(String... strings) {
        JSONParser jsonParser = new JSONParser();
        listDataHeader = new ArrayList<>();
        listDataChild = new HashMap<>();

        //get JSON string from URL
        JSONArray json = jsonParser.getMTOQuestions(mtoURL);
        //JSONObject json = jsonParser.getMTOQuestions(mtoURL);


            try{
                //JSONObject c = json.getJSONObject(HEADER1);
                //JSONArray jsonArray = json.getJSONArray(0);

                for(int i =0; i<json.length(); i++){
                    //Log.e("INSIDE_MTO",""+c.getString(HEADER1));
                    //String question = c.getString(QUESTION);
                    JSONObject job = json.getJSONObject(i);
                    JSONArray header1 = job.getJSONArray(HEADER1);
                    listDataHeader.add(HEADER1);
                    Log.e("INSIDE_MTO",""+json);
                    for (int quest_in_headr = 0; quest_in_headr<header1.length(); quest_in_headr++){
                        JSONObject jsonHeader1 = header1.getJSONObject(quest_in_headr);
                        question = jsonHeader1.getString(QUESTION);
                        String qid = jsonHeader1.getString(QUESTION_ID);
                        //HashMap<String, String> forHeader1 = new HashMap<>();
                        List<String> forHeader1 = new ArrayList<>();
                        forHeader1.add(question.trim());
                        //Log.e("INSIDE_INNER_LOOP", question);
                        listDataChild.put(listDataHeader.get(0), forHeader1);
                        //Log.e("ADD_DATA",""+listDataHeader.add(HEADER1));
                    }

                    // map.put(QUESTION_ID, qid.trim());

                }
            }
            catch (JSONException e){
                e.printStackTrace();
            }
            finally {

            }
        return null;
    }

以下是JSONParser代码的样子

   public JSONArray getMTOQuestions(String url){
    StringBuilder builder = new StringBuilder();
    HttpClient client = new DefaultHttpClient();
    HttpGet httpGet = new HttpGet(url);

    try{
        HttpResponse response = client.execute(httpGet);
        StatusLine statusLine = response.getStatusLine();
        int statusCode = statusLine.getStatusCode();
        if (statusCode == 200){
            HttpEntity entity = response.getEntity();
            InputStream content = entity.getContent();
            BufferedReader reader = new BufferedReader(new InputStreamReader(content));
            String line;
            while ((line = reader.readLine()) != null){
                builder.append(line);
                //Log.i("OutletList",line+"\n");
            }
        }
        else {
            Log.e("MTOQUESTION","Failed load MTO questionnaire");
        }
    }
    catch (ClientProtocolException cpe){
        cpe.printStackTrace();
    }
    catch (IOException ioexception){
        ioexception.printStackTrace();
    }
    finally {

    }

    //try parse the JSON to an Object
    try{
        jarray = new JSONArray(builder.toString().trim());
    }
    catch (JSONException ex){ex.printStackTrace();}

    //return the JSON string gotten
    return jarray;
}

什么Log.e(“INSIDE_MTO”,“”+ json);返回是

[{"NND (Megastore \/ Supermarket)":[{"question":"\"33\" Export (Can)","questionid":"32"},{"question":"Ace Roots (Can)","questionid":"33"},{"question":"Amstel (Can)","questionid":"34"},{"question":"Climax (Can)","questionid":"35"},{"question":"Fayrouz (Cann)","questionid":"36"},{"question":"Goldberg (RGB)","questionid":"37"},{"question":"Gulder (Can)","questionid":"38"},{"question":"Gulder  (RGB)","questionid":"39"},{"question":"Heineken (Can)","questionid":"40"},{"question":"Heineken (RGB)","questionid":"41"},{"question":"Legend  (Can)","questionid":"42"},{"question":"Maltina   (Can)","questionid":"43"},{"question":"Star (Can)","questionid":"44"},{"question":"Star (RGB)","questionid":"45"},{"question":"Star  Radler (Can)","questionid":"46"},{"question":"Strongbow (Can)","questionid":"47"}]},{"NND (Superette - including returnable)":[{"question":"\"33\" Export (Can)","questionid":"48"},{"question":"Ace Roots (Can)","questionid":"49"},{"question":"Amstel (Can)","questionid":"50"},{"question":"Climax (Can)","questionid":"51"},{"question":"Fayrouz (Cann)","questionid":"52"},{"question":"Goldberg (RGB)","questionid":"53"},{"question":"Gulder (Can)","questionid":"54"},{"question":"Gulder  (RGB)","questionid":"55"},{"question":"Heineken (Can)","questionid":"56"},{"question":"Heineken (RGB)","questionid":"57"},{"question":"Legend  (Can)","questionid":"58"},{"question":"Maltina   (Can)","questionid":"59"},{"question":"Star (Can)","questionid":"60"},{"question":"Star (RGB)","questionid":"61"},{"question":"Star  Radler (Can)","questionid":"62"},{"question":"Strongbow (Can)","questionid":"63"}]}]

但我一直收到这个错误:

JsonException "org.json.JSONException: No value for  NND (Megastore \/ Supermarket)" 

并且错误指向这行代码

JSONArray header1 = job.getJSONArray(HEADER1);

我在线搜索并在Stackoverflow上看到类似的问题,但似乎我自己的情况有点不同。如果你能提供帮助,我将非常感谢你们。

感谢您的期待。

2 个答案:

答案 0 :(得分:0)

{"NND (Superette - including returnable)":的对象抛出异常。

具有HEADER1值的正确键的第一个JSON对象不是问题。

您正在使用此代码解析第二个(及后续)JSON对象

for(int i =0; i<json.length(); i++){
    JSONObject job = json.getJSONObject(i);
    JSONArray header1 = job.getJSONArray(HEADER1); // Error when i >= 1

答案 1 :(得分:0)

这是更新的代码,它按预期工作。所以我做的是获取JSON,然后获取带有变量obj的键,然后遍历键以获取键内的数组。

 JSONArray json = jsonParser.getMTOQuestions(mtoURL);


        try {
            //JSONObject c = json.getJSONObject(HEADER1);
            //JSONArray jsonArray = json.getJSONArray(0);

            for (int i = 0; i < json.length(); i++) {
                //Log.e("INSIDE_MTO",""+c.getString(HEADER1));
                //String question = c.getString(QUESTION);
                JSONObject job = json.getJSONObject(i);
                Iterator<?> keys = job.keys();
                //int child = 0;
                while (keys.hasNext()) {
                    String key = (String) keys.next();
                    try {
                        Log.e("INSIDE_MTO", "" + key);
                        listDataHeader.add(key);

                        JSONArray headers = job.getJSONArray(key);
                        List<String> questionList = new ArrayList<>();
                        for (int quest_in_headr = 0; quest_in_headr < headers.length(); quest_in_headr++) {
                            JSONObject jsonHeader1 = headers.getJSONObject(quest_in_headr);
                            question = jsonHeader1.getString(QUESTION);
                            qid = jsonHeader1.getString(QUESTION_ID);

                            questionList.add(question.trim());
                            //Log.e("INSIDE_INNER_LOOP", question + " " + qid);
                            //Log.e("ADD_DATA", "" + question);
                        }
                        listDataChild.put(listDataHeader.get(i), questionList);


                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }
            }
            Log.e("VALUES_IN_QUESTANS", "" + questans);
        } catch (JSONException e) {
            e.printStackTrace();
        }