2016-07-21 9 views
1

Я новичок в android, хотя мне приходится сталкиваться с проблемой при анализе массива json с массивом.разбор массива json с массивом через GSON

{ 
"menu": [ 
    { 
     "Soups": [ 
      { 
       "name": "Safed Tamatar aur Tulsi ", 
       "price": 150, 
       "description": "", 
       "veg": true, 
       "spicy": null 
      }, 
      { 
       "name": "Dum Murg", 
       "price": 168, 
       "description": "", 
       "veg": false, 
       "spicy": null 
      }, 
      { 
       "name": "Murg Zaffrani", 
       "price": 168, 
       "description": "", 
       "veg": false, 
       "spicy": null 
      }, 
      { 
       "name": "Tomato Dhania", 
       "price": 150, 
       "description": "", 
       "veg": true, 
       "spicy": null 
      } 
     ] 
    }, 
    { 
     "Starters": [ 
      { 
       "name": "Achari Paneer tikka", 
       "price": 347, 
       "description": "", 
       "veg": true, 
       "spicy": null 
      }, 
      { 
       "name": "Paneer Tikka", 
       "price": 347, 
       "description": "", 
       "veg": true, 
       "spicy": null 
      }, 
      { 
       "name": "Murg Tikka", 
       "price": 393, 
       "description": "", 
       "veg": false, 
       "spicy": null 
      }, 
      { 
       "name": "Tandoori Murg (Half)", 
       "price": 410, 
       "description": "", 
       "veg": false, 
       "spicy": null 
      }, 
      { 
       "name": "Tandoori Murg (Full)", 
       "price": 851, 
       "description": "", 
       "veg": false, 
       "spicy": null 
      }, 
      { 
       "name": "Macchi Tikka", 
       "price": 626, 
       "description": "", 
       "veg": false, 
       "spicy": null 
      } 
     ] 
    }, 
    { 
     "Main Course": [ 
      { 
       "name": "Jeera Aloo", 
       "price": 275, 
       "description": "", 
       "veg": true, 
       "spicy": null 
      }, 
      { 
       "name": "Paneer Tikka Masala", 
       "price": 392, 
       "description": "", 
       "veg": true, 
       "spicy": null 
      }, 
      { 
       "name": "Palak Paneer", 
       "price": 370, 
       "description": "", 
       "veg": true, 
       "spicy": null 
      }, 
      { 
       "name": "Murg Kadhai", 
       "price": 428, 
       "description": "", 
       "veg": false, 
       "spicy": null 
      }, 
      { 
       "name": "Murg Tikka Masala", 
       "price": 428, 
       "description": "", 
       "veg": false, 
       "spicy": null 
      }, 
      { 
       "name": "Palak Gosht", 
       "price": 455, 
       "description": "", 
       "veg": false, 
       "spicy": null 
      }, 
      { 
       "name": "Macchi Kadhai", 
       "price": 545, 
       "description": "", 
       "veg": false, 
       "spicy": null 
      } 
     ] 
    }, 
    { 
     "Rice": [] 
    }, 
    { 
     "Breads": [] 
    }, 
    { 
     "Accompaniments": [] 
    }, 
    { 
     "Beverages": [] 
    }, 
    { 
     "Dessert": [] 
    }, 
    { 
     "Signature Mocktails": [] 
    }, 
    { 
     "Wraps": [] 
    }, 
    { 
     "Lentils": [ 
      { 
       "name": "Dal Tadka", 
       "price": 226, 
       "description": "", 
       "veg": true, 
       "spicy": null 
      }, 
      { 
       "name": "Dal Kolhapuri", 
       "price": 226, 
       "description": "", 
       "veg": true, 
       "spicy": null 
      }, 
      { 
       "name": "Dal Makhani", 
       "price": 275, 
       "description": "", 
       "veg": true, 
       "spicy": null 
      } 
     ] 
    } 
    ], 
    "name": "Zaffran" 
} 

Я хочу разобрать этот файл, но там нет такого кода в Интернете, чтобы разобрать этот файл через GSON. я использовал следующий код:

JSONObject jsonObject = (JSONObject) new JSONTokener(response).nextValue(); 
     JSONArray jsonArray = jsonObject.getJSONArray("menu"); 
     String jsonString = jsonArray.toString(); 
     Type type = new TypeToken<Map<String, String>>() { 
     }.getType(); 
     Map<String, String> myMap = new Gson().fromJson(jsonString, type); 
     for (Map.Entry<String, String> entry : myMap.entrySet()) { 
      key = entry.getKey(); 
      value = entry.getValue(); 
      // do stuff 
     } 
     responseView.setText(value); 

Но это дает ошибку, что строка ожидаемый найденный массив. Пожалуйста, помогите мне

+0

Это поможет you.https: //www.javacodegeeks.com/2011/01/android-json-parsing-gson-tutorial.html & http://blog.nkdroidsolutions.com/how-to -parsing-json-array-using-gson-in-android-tutorial/ –

+0

спасибо за помощь, но я попробовал одну из ваших ссылок, но, похоже, она тоже не работает, она дает следующую ошибку: ожидается строка, но BEGIN_ARRAY в строке 1 столбца 10- @SuhasB –

ответ

0

Используйте приведенный ниже код, чтобы проанализировать ваши полные данные json.

try { 
     JSONObject jsonObject = new JSONObject(jsonArray); 

     JSONArray jsonArray1 = jsonObject.getJSONArray("menu"); 
     Menu menu = new Menu(); 
     if (jsonObject.has("name")) { 
      menu.setName(jsonObject.getString("name")); 
     } else { 
      menu.setName(""); 
     } 
     List<MenuHeaders> menuHeadersList = new ArrayList<>(); 
     for (int i = 0; i < jsonArray1.length(); i++) { 
      JSONObject jsonObject1 = jsonArray1.getJSONObject(i); 
      MenuHeaders menuHeaders = new MenuHeaders(); 
      //Creating list to save all prices and item names 
      List<ItemDetails> list = new ArrayList<>(); 
      JSONArray subHeaderJsonArray = null; 

      if (jsonObject1.has("Soups")) { 
       menuHeaders.setTitle("Soups"); 
       subHeaderJsonArray = jsonObject1.getJSONArray("Soups"); 
      } 
      if (jsonObject1.has("Starters")) { 
       menuHeaders.setTitle("Starters"); 
       subHeaderJsonArray = jsonObject1.getJSONArray("Starters"); 

      } 
      if (jsonObject1.has("Main Course")) { 
       menuHeaders.setTitle("Main Course"); 
       subHeaderJsonArray = jsonObject1.getJSONArray("Main Course"); 
      } 
      if (jsonObject1.has("Rice")) { 
       menuHeaders.setTitle("Rice"); 
       subHeaderJsonArray = jsonObject1.getJSONArray("Rice"); 
      } 
      if (jsonObject1.has("Breads")) { 
       menuHeaders.setTitle("Breads"); 
       subHeaderJsonArray = jsonObject1.getJSONArray("Breads"); 
      } 
      if (jsonObject1.has("Accompaniments")) { 
       menuHeaders.setTitle("Accompaniments"); 
       subHeaderJsonArray = jsonObject1.getJSONArray("Accompaniments"); 
      } 
      //Add all other sub menu items to menu object 

      if (jsonObject1.has("Lentils")) { 
       menuHeaders.setTitle("Lentils"); 
       subHeaderJsonArray = jsonObject1.getJSONArray("Lentils"); 
      } 
      if (subHeaderJsonArray != null) { 
       for (int index1 = 0; index1 < subHeaderJsonArray.length(); index1++) { 
        JSONObject subHeaderJsonObject = subHeaderJsonArray.getJSONObject(i); 
        ItemDetails itemDetails = new ItemDetails(); 
        itemDetails.setName(subHeaderJsonObject.getString("name")); 
        itemDetails.setPrice(subHeaderJsonObject.getInt("price")); 
        itemDetails.setDescription(subHeaderJsonObject.getString("description")); 
        itemDetails.setVeg(subHeaderJsonObject.getBoolean("veg")); 
        itemDetails.setSpicy(subHeaderJsonObject.getString("spicy")); 
        list.add(itemDetails); 
       } 
       menuHeaders.setList(list); 
      } 
      menuHeadersList.add(menuHeaders); 
      menu.setMenuHeaders(menuHeadersList); 
     } 

    } catch (JSONException e) { 
     e.printStackTrace(); 
    } 
+0

Я. работает, но проблема в том, что мне нужно разобрать эти данные в форме массива, не зная имя внутренних массивов, например: супы, стартер и т. Д. –

+0

Нет .. Без знания строки вы не можете разобрать. В любом случае у вас есть названия и данные, которые вы получаете. Правильно? Тогда почему бы вам не использовать этот код для разбора. –

+0

Спасибо, что помогли мне. –

0

Это не идеальный ответ, но я попытался показать вам формат разбора вложенного json. Это даст вам json-массив «Меню» и его внутренние массивы.

Измените его в соответствии с вашими потребностями.

JSONObject jsonMenu = mJsonObject.optJSONObject("menu"); 

       JSONArray jsnSoupsarr = jsonMenu.optJSONArray("Soups"); 
       for (int k = 0; k < jsnSoupsarr.length(); k++) { 
        JSONObject jsnSoup = jsnMSouparr.optJSONObject(k); 
        //here get the inner fields of "Soup" like "price","name" etc. 
       } 

       JSONArray startersJson = jsnMenu.optJSONArray("Starters"); 
       for (int k = 0; k < starterJson.length(); k++) { 
        JSONObject objstarter = starterJson.optJSONObject(k); 
       } 

       JSONArray mainCourseJson = jsnMenu.optJSONArray("Main Course"); 
       for (int k = 0; k < mainCourseJson.length(); k++) { 
        JSONObject objmainCourse = mainCourseJson.optJSONObject(k);} 

Надеюсь, это поможет!

+0

Ya .. работает, но проблема в том, что это меню не является статическим объектом. В принципе, меню дает общее для любого ресторана. Нет необходимости иметь все эти вещи, может быть, есть альтернативная разновидность этих блюд, поэтому мне нужно разобрать эти данные в форме массива, не зная названия внутренних массивов ... - @ Suhas B –

+0

Если вы этого не сделаете, хотите анализировать имена, вы можете получить их по позициям. Например, возьмите ** для цикла ** для ** меню ** массива и используйте 'jsonMenu.optJSONArray (i)' в том, что для цикла, как и во внутренних массивах для ** супов ** и ** starters **. – Bee

+0

Спасибо ..от вас так много .. Он работал !!! –

Смежные вопросы