No se puede hacer un bucle a través de la cadena json dinámica recursivamente en Android

Esta es mi cadena JSON (esto cambia dinámicamente):

enter image description here

Este es un objeto json de toda la cadena json que es una matriz. Si el objeto JSON tiene un valor mayor que 1 para “ChildExists” (por ejemplo, 4 como a continuación), aparece una matriz llamada “Categorías” y se mostrarán 4 objetos. Si el valor de childExist de cualquiera de esos objetos llega a ser mayor que 1, aparecerá una matriz json llamada “Categorías”.

Esto sucederá una y otra vez si el valor del objeto para “childExists” es mayor que 0. Creé 2 clases de modelo para esto con los siguientes atributos:

public class Menu implements Serializable{ private static final long serialVersionUID = -3407147461924698222L; String parentName; String position; String childExists; String categoryName; String categoryID; String parentID; List categories = new ArrayList(); //getters and setters } public class Category implements Serializable{ private static final long serialVersionUID = -3407147461924698222L; String parentName; String position; String childExists; String categoryName; String categoryID; String parentID; //getters and setters } 

Así es como traté de descomponer el JSON:

 public static ArrayList getMenuTreeBreakDown(JSONArray arg0) throws JSONException { ArrayList menuList = new ArrayList(); for(int i = 0; i < arg0.length(); i++){ JSONObject jsonCategoryObject = arg0.getJSONObject(i); Menu menu = new Menu(); String parentName = jsonCategoryObject.getString("ParentName"); String position = jsonCategoryObject.getString("Position"); String childExists = jsonCategoryObject.getString("ChildExists"); String categoryName = jsonCategoryObject.getString("Category_Name"); String categoryID = jsonCategoryObject.getString("Category_ID"); String parentID = jsonCategoryObject.getString("Parent_ID"); menu.setParentName(parentName); menu.setPosition(position); menu.setChildExists(childExists); menu.setCategoryName(categoryName); menu.setCategoryID(categoryID); menu.setParentID(parentID); if(!childExists.equalsIgnoreCase("0")){ //this part should happen over and over again if there is a category[] JSONArray categoryArray = new JSONArray(jsonCategoryObject.getString("Categories")); for (int x = 0; x < categoryArray.length(); x++){ JSONObject jsonProductObject1 = categoryArray.getJSONObject(x); Category category = new Category(); category.setParentName(jsonProductObject1.getString("ParentName")); category.setPosition(jsonProductObject1.getString("Position")); category.setChildExists(jsonProductObject1.getString("ChildExists")); category.setCategoryName(jsonProductObject1.getString("Category_Name")); category.setCategoryID(jsonProductObject1.getString("Category_ID")); category.setParentID(jsonProductObject1.getString("Parent_ID")); menu.getCategories().add(category); } } menuList.add(menu); } return menuList; } 

Hasta ahora no pude obtener los resultados correctos. ¡Cualquier ayuda es muy apreciada!

// tengo esto funcionando:

GSON utilizado, cambió la clase de modelo:

 public class Menu{ @SerializedName("ParentName") String parentName; @SerializedName("Position") String position; @SerializedName("ChildExists") String childExists; @SerializedName("Category_Name") String categoryName; @SerializedName("Category_ID") String categoryID; @SerializedName("Parent_ID") String parentID; @SerializedName("Categories") List categories = new ArrayList(); //getters and setters } ArrayList menuList = new ArrayList(); Gson gson = new Gson(); JsonParser parser = new JsonParser(); JsonArray jArray = parser.parse(arg0.toString()).getAsJsonArray(); for(JsonElement obj : jArray ) { Menu menu = gson.fromJson( obj , Menu.class); menuList.add(menu); } 

¿Depuraste y compruebas dónde se rompe exactamente?

Use a para cada bucle donde pueda en lugar de para (;;)

http://docs.oracle.com/javase/1.5.0/docs/guide/language/foreach.html

¿Cómo funciona el bucle Java ‘for each’?

Además, si tiene un JSON complicado, puede ser mejor que use Gson para mapear datos y sus clases modelo. P.ej.:

  Gson gson = new Gson(); ModelClass modelClass= new ModelClass(); modelClass= gson.fromJson(responseContent,ModelClass.class); //where responseContent is your jsonString Log.i("Web service response", ""+modelClass.toString()); 

https://code.google.com/p/google-gson/

Para las discrepancias de denominación (de acuerdo con las variables en el servicio web), puede usar anotaciones como @SerializedName. (Así que no es necesario usar Serializable)