2016-07-16 3 views
0

У меня проблемы с веб-службой, как выглядит служба.Как перебирать массив json в другом массиве в android

[ 

{"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)"; 

Я использую 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, но, похоже, мой собственный случай немного отличается. Буду признателен, если вы сможете помочь.

Благодарим вас в ожидании.

+0

Пожалуйста, отредактируйте ваш вопрос с помощью [mcve]. Например, мы не можем помочь вам без значения 'HEADER1', и ваш JSON (и код) можно значительно уменьшить, чтобы выделить только проблему. –

+1

Хотя, я думаю, проблема в том, что если' HEADER1' является 'NND (Megastore \/Супермаркет), то ваш второй объект JSON в массиве не имеет этого заголовка, поэтому, конечно, вы получите это исключение –

+0

@ cricket_007 вот значение HEADER1 NND (Megastore \/Supermarket) У меня также есть обновил вопрос, чтобы показать, что Log.e ("INSIDE_MTO", "" + json); return –

ответ

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(); 
     } 
+0

Почему вы не приняли моего ответа? Это помогло вам опубликовать этот ... –

+0

, который не был преднамеренным, потому что я хотел, чтобы другие люди знали, что обновленный код является рабочим кодом. –

0

Объект {"NND (Superette - including returnable)": исключает.

Первый объект JSON, который имеет правильный ключ значения HEADER1, не является проблемой.

Вы разборе, что второй (и последующие) объект JSON с этим кодом

for(int i =0; i<json.length(); i++){ 
    JSONObject job = json.getJSONObject(i); 
    JSONArray header1 = job.getJSONArray(HEADER1); // Error when i >= 1 
Смежные вопросы