Obtener datos de JSON en la vista de lista

Estoy tratando de obtener los datos de JSON en ListView, pero cada vez que estoy recibiendo página en blanco, ni obtener lista de categorías ni error.

Soy nuevo en Android, y tratando de hacer Multi Level ListView utilizando JSON ,

En mi caso quiero lograr esto usando sólo JSON : Categoría> Artículos> Detalle

Pero estoy enfrentando el problema en la primera pantalla, incluso no es capaz de buscar Categoría

JSON:

{ "categoryId": "1", "categoryTitle": { "SmartPhones": [ { "itemId": "1", "itemTitle": "Galaxy Mega 5.8" }, { "itemId": "2", "itemTitle": "Galaxy Mega 6.3" } ] }, "categoryId": "2", "categoryTitle": { "Tablets": [ { "itemId": "1", "itemTitle": "Galaxy Note 510" }, { "itemId": "2", "itemTitle": "Galaxy Note 800" } ]} } 

Gracias @Segi para darme el formato JSON correcto

Código de actividad:

  public class CategoriesActivity extends ListActivity { // Connection detector ConnectionDetector cd; // Alert dialog manager AlertDialogManager alert = new AlertDialogManager(); // Progress Dialog private ProgressDialog pDialog; // Creating JSON Parser object JSONParser jsonParser = new JSONParser(); ArrayList<HashMap<String, String>> categoriesList; // albums JSONArray JSONArray categories = null; // albums JSON url private static final String URL_CATEGORIES = "my.json"; // providing proper URL // ALL JSON node names private static final String TAG_ID = "categoryId"; private static final String TAG_TITLE = "categoryTitle"; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_albums); cd = new ConnectionDetector(getApplicationContext()); // Check for internet connection if (!cd.isConnectingToInternet()) { // Internet Connection is not present alert.showAlertDialog(CategoriesActivity.this, "Internet Connection Error", "Please connect to working Internet connection", false); // stop executing code by return return; } // Hashmap for ListView categoriesList = new ArrayList<HashMap<String, String>>(); // Loading Categories JSON in Background Thread new LoadCategories().execute(); // get listview ListView lv = getListView(); /** * Listview item click listener * ProductListActivity will be lauched by passing category id * */ lv.setOnItemClickListener(new android.widget.AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView<?> arg0, View view, int arg2, long arg3) { // on selecting a single category // ProductListActivity will be launched to show products inside the category Intent i = new Intent(getApplicationContext(), TrackListActivity.class); // send category id to productlist activity to get list of products under that category String category_id = ((TextView) view.findViewById(R.id.album_id)).getText().toString(); i.putExtra("category_id", category_id); startActivity(i); } }); } /** * Background Async Task to Load all Categories by making http request * */ class LoadCategories extends AsyncTask<String, String, String> { /** * Before starting background thread Show Progress Dialog * */ @Override protected void onPreExecute() { super.onPreExecute(); pDialog = new ProgressDialog(CategoriesActivity.this); pDialog.setMessage("Listing Categories ..."); pDialog.setIndeterminate(false); pDialog.setCancelable(false); pDialog.show(); } /** * getting Categories JSON * */ protected String doInBackground(String... args) { // Building Parameters List<NameValuePair> params = new ArrayList<NameValuePair>(); // getting JSON string from URL String json = jsonParser.makeHttpRequest(URL_CATEGORIES, "GET", params); // Check your log cat for JSON reponse Log.d("Categories JSON: ", "> " + json); try { categories = new JSONArray(json); if (categories != null) { // looping through all categories for (int i = 0; i < categories.length(); i++) { JSONObject c = categories.getJSONObject(i); // Storing each json item values in variable String id = c.getString(TAG_ID); String title = c.getString(TAG_TITLE); // creating new HashMap HashMap<String, String> map = new HashMap<String, String>(); // adding each child node to HashMap key => value map.put(TAG_ID, id); map.put(TAG_TITLE, title); // adding HashList to ArrayList categoriesList.add(map); } }else{ Log.d("Categories: ", "null"); } } catch (JSONException e) { e.printStackTrace(); } return null; } /** * After completing background task Dismiss the progress dialog * **/ protected void onPostExecute(String file_url) { // dismiss the dialog after getting all categories pDialog.dismiss(); // updating UI from Background Thread runOnUiThread(new Runnable() { public void run() { /** * Updating parsed JSON data into ListView * */ ListAdapter adapter = new SimpleAdapter( CategoriesActivity.this, categoriesList, R.layout.list_item_albums, new String[] { TAG_ID, TAG_TITLE }, new int[] { R.id.category_id, R.id.category_title }); // updating listview setListAdapter(adapter); } }); } } } 

Logcat:

 06-15 12:21:27.124: D/dalvikvm(786): GC_FOR_ALLOC freed 68K, 8% free 2488K/2680K, paused 173ms, total 213ms 06-15 12:21:27.174: I/dalvikvm-heap(786): Grow heap (frag case) to 3.152MB for 635812-byte allocation 06-15 12:21:27.264: D/dalvikvm(786): GC_FOR_ALLOC freed 1K, 6% free 3108K/3304K, paused 89ms, total 89ms 06-15 12:21:27.354: D/dalvikvm(786): GC_CONCURRENT freed <1K, 6% free 3111K/3304K, paused 5ms+3ms, total 95ms 06-15 12:21:28.274: I/Choreographer(786): Skipped 41 frames! The application may be doing too much work on its main thread. 06-15 12:21:28.874: I/Choreographer(786): Skipped 123 frames! The application may be doing too much work on its main thread. 06-15 12:21:29.044: D/gralloc_goldfish(786): Emulator without GPU emulation detected. 06-15 12:21:29.134: D/dalvikvm(786): GC_CONCURRENT freed 19K, 4% free 3478K/3620K, paused 8ms+38ms, total 268ms 06-15 12:21:30.894: I/Choreographer(786): Skipped 51 frames! The application may be doing too much work on its main thread. 06-15 12:20:36.624: D/Categories JSON:(786): > { 06-15 12:20:36.624: D/Categories JSON:(786): "categoryId": "1", 06-15 12:20:36.624: D/Categories JSON:(786): "categoryTitle": { 06-15 12:20:36.624: D/Categories JSON:(786): "SmartPhones": [ 06-15 12:20:36.624: D/Categories JSON:(786): { 06-15 12:20:36.624: D/Categories JSON:(786): "itemId": "1", 06-15 12:20:36.624: D/Categories JSON:(786): "itemTitle": "Galaxy Mega 5.8" 06-15 12:20:36.624: D/Categories JSON:(786): }, 06-15 12:20:36.624: D/Categories JSON:(786): { 06-15 12:20:36.624: D/Categories JSON:(786): "itemId": "2", 06-15 12:20:36.624: D/Categories JSON:(786): "itemTitle": "Galaxy Mega 6.3" 06-15 12:20:36.624: D/Categories JSON:(786): } 06-15 12:20:36.624: D/Categories JSON:(786): ] 06-15 12:20:36.624: D/Categories JSON:(786): }, 06-15 12:20:36.624: D/Categories JSON:(786): "categoryId": "2", 06-15 12:20:36.624: D/Categories JSON:(786): "categoryTitle": {"Tablets": [ 06-15 12:20:36.624: D/Categories JSON:(786): { 06-15 12:20:36.624: D/Categories JSON:(786): "itemId": "1", 06-15 12:20:36.624: D/Categories JSON:(786): "itemTitle": "Galaxy Note 510" 06-15 12:20:36.624: D/Categories JSON:(786): }, 06-15 12:20:36.624: D/Categories JSON:(786): { 06-15 12:20:36.624: D/Categories JSON:(786): "itemId": "2", 06-15 12:20:36.624: D/Categories JSON:(786): "itemTitle": "Galaxy Note 800" 06-15 12:20:36.624: D/Categories JSON:(786): } 06-15 12:20:36.624: D/Categories JSON:(786): ]} 06-15 12:20:36.624: D/Categories JSON:(786): } 06-15 12:20:36.814: W/System.err(786): org.json.JSONException: Value {"categoryTitle":{"SmartPhones":[{"itemId":"1","itemTitle":"Galaxy Mega 5.8"},{"itemId":"2","itemTitle":"Galaxy Mega 6.3"}]},"categoryId":"2"} of type org.json.JSONObject cannot be converted to JSONArray 06-15 12:20:36.824: W/System.err(786): at org.json.JSON.typeMismatch(JSON.java:111) 06-15 12:20:36.836: W/System.err(786): at org.json.JSONArray.<init>(JSONArray.java:91) 06-15 12:20:36.836: W/System.err(786): at org.json.JSONArray.<init>(JSONArray.java:103) 06-15 12:20:36.904: W/System.err(786): at com.my.json.CategoriesActivity$LoadCategories.doInBackground(CategoriesActivity.java:135) 06-15 12:20:36.904: W/System.err(786): at com.my.json.CategoriesActivity$LoadCategories.doInBackground(CategoriesActivity.java:1) 06-15 12:20:36.914: W/System.err(786): at android.os.AsyncTask$2.call(AsyncTask.java:287) 06-15 12:20:36.914: W/System.err(786): at java.util.concurrent.FutureTask.run(FutureTask.java:234) 06-15 12:20:36.925: W/System.err(786): at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1080) 06-15 12:20:36.925: W/System.err(786): at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:573) 06-15 12:20:36.934: W/System.err(786): at java.lang.Thread.run(Thread.java:856) 06-15 12:20:45.984: D/InputEventConsistencyVerifier(786): KeyEvent: ACTION_UP but key was not down. 06-15 12:20:45.984: D/InputEventConsistencyVerifier(786): in android.view.ViewRootImpl@40de89c8 06-15 12:20:45.984: D/InputEventConsistencyVerifier(786): 0: sent at 106936000000, KeyEvent { action=ACTION_UP, keyCode=KEYCODE_MENU, scanCode=229, metaState=0, flags=0x8, repeatCount=0, eventTime=106936, downTime=106820, deviceId=0, source=0x101 } 

Nota: Obtener actividad en blanco, no obtener datos en ListView, no obtener ningún error

JSON es válido, pero ilógico, debe ser así

 [ { "categoryId": "1", "categoryTitle": "SmartPhones", "SmartPhones": [ { "itemId": "1", "itemTitle": "Galaxy Mega 5.8" }, { "itemId": "2", "itemTitle": "Galaxy Mega 6.3" } ] }, { "categoryId": "1", "categoryTitle": "Tablets", "Tablets": [ { "itemId": "1", "itemTitle": "Galaxy Mega 5.8" }, { "itemId": "2", "itemTitle": "Galaxy Mega 6.3" } ] } ] 

Entonces el código será:

  if (categories != null) { // looping through All albums for (int i = 0; i < categories.length(); i++) { JSONObject oneCategory = categories.getJSONObject(i); String categoryName = oneCategory.getString(TAG_ID); String catTitle = oneCategory.getString( TAG_TITLE ); JSONArray categoryTitle = oneCategory.getJSONArray(catTitle); for( int i = 0 ; i < categoryTitle.length() ; i++ ) { JSONObject item = categoryTitle.getJSONObject(i); String id = item.getString("itemId"); String name = item.getString("itemTitle"); // creating new HashMap HashMap<String, String> map = new HashMap<String, String>(); // adding each child node to HashMap key => value map.put(TAG_ID, id); map.put(TAG_TITLE, name); } // adding HashList to ArrayList categoriesList.add(map); } }else{ Log.d("Categories: ", "null"); } 

Sí, de Logcat está claro que hay un problema con JSON.

Prueba lo siguiente JSON .->

[{"CategoryId": "1", "categoryTitle": "Tabletas", "Tabletas": {{itemId} 2 "," itemTitle ":" Galaxy Mega 6.3 "}}}, {" categoryId ":" 2 "," categoryTitle ": Nota 510 "}, {" itemId ":" 2 "," itemTitle ":" Galaxy Note 800 "}]}}]

No hice nada especial, pero agregó algunos corchetes para hacer que el formato JSON. Si está recibiendo esto de php, haga los cambios necesarios allí para darle formato.

Nota: Aquí, JSON tiene una estructura compleja, así que tenga cuidado al analizar.

 "categoryTitle" : "Appetizers" : [ 

y

 "categoryTitle" : "Mixed Platter" : [ 

Eso es incorrecto. ¿Que estás tratando de hacer?

Intente abajo Json:

 { "categoryId": "1", "categoryTitle": { "Appetizers": [ { "itemId": "1", "itemTitle": "Samosa" }, { "itemId": "2", "itemTitle": "Vegetable Pakora" } ] }, "categoryId": "2", "categoryTitle": {"Mixed Platter": [ { "itemId": "1", "itemTitle": "Veggie" }, { "itemId": "2", "itemTitle": "Non Veggie" } ]} } 

Pruebe a ajustar el adaptador a la vista de lista justo después de salir del bucle (JSON Looping)

 String json = "{'categoryId': '1', 'categoryTitle': {'Appetizers': [{'itemId': '1','itemTitle': 'Samosa'},{'itemId': '2','itemTitle': 'Vegetable Pakora'}]}},{'categoryId': '2', 'categoryTitle': {'Appetizers': [{'itemId': '1','itemTitle': 'Samosa'},{'itemId': '2','itemTitle': 'Vegetable Pakora'}]}}"; try { json = "[" + json + "]"; JSONArray mArray = new JSONArray(json); for (int i = 0; i < mArray.length(); i++) { JSONObject mJsonObject = new JSONObject(mArray.get(0) .toString()); String categoryId = mJsonObject.getString("categoryId"); String categoryTitle = mJsonObject.getString("categoryTitle"); mJsonObject = new JSONObject(categoryTitle); String mVal = mJsonObject.toString().split(":")[0].replace( "\"", "").replace("{", ""); String Resutlt = mJsonObject.getString(mVal); JSONArray mArray1 = new JSONArray(Resutlt); for (int j = 0; j < mArray1.length(); j++) { mJsonObject = mArray1.getJSONObject(j); String itemId = mJsonObject.getString("itemId"); String itemTitle = mJsonObject.getString("itemTitle"); } } } catch (JSONException e) { e.printStackTrace(); } 
  • JsonSubTypes, lista de objetos polimórficos y Parcelable
  • ¿Está google gson funcionando en android?
  • Cómo hacer un servicio web (preferiblemente usando PHP) que puede ser solicitado para obtener objetos JSON por la aplicación android
  • Error de análisis de Android JSON no se puede convertir a JSONArray
  • Sugerencias de búsqueda de recursos de red en el cuadro Búsqueda rápida
  • Objeto de matriz Iterate JSON
  • Android JSONArrays dentro de JSONArray
  • Mensaje de error 'java.net.SocketException: socket failed: EACCES (Permiso denegado)'
  • Vaciar RecyclerView utilizando datos obtenidos de parse.com
  • Opciones de comunicación peer-to-peer
  • Publicar Método utilizando Volley no funciona
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.