Obtener JSONArray sin nombre de matriz?

Soy nuevo en JSON y estoy probando este tutorial: http://p-xr.com/android-tutorial-how-to-parse-read-json-data-into-a-android-listview/#comments

Soy nuevo en JSON, C languages, Java y también Android, pero estoy aprendiendo. El tutorial usa lo que estoy llamando una matriz con nombre, pero todos los JSON que voy a utilizar en mi proyecto de Android utilizarán filas de tablas simples sin matriz con nombre. Ejemplos del JSON que estoy usando y el terremoto json del tutorial están a continuación.

El tutorial itera a través de la matriz de terremotos y se convierte en una lista de hashmap de JAVA usando el siguiente código:

JSONArray earthquakes = json.getJSONArray("earthquakes"); for(int i=0;i<earthquakes.length();i++){ HashMap map = new HashMap(); JSONObject e = earthquakes.getJSONObject(i); map.put("id", String.valueOf(i)); map.put("name", "Earthquake name:" + e.getString("eqid")); map.put("magnitude", "Magnitude: " + e.getString("magnitude")); mylist.add(map); } 

Mi pregunta es, ¿cómo puedo usar json.getJSONArray("") si mi JSON es simplemente simple, como a continuación? Puedo convertir el rest del código, solo necesito saber cómo cargar ese JSON usando getJSONArray("strJsonArrayName") si no tengo un strJsonArrayName .

Mi JSON (matriz no conectada)

 [ { "cnt":1, "name":"American", "pk":7 }, { "cnt":2, "name":"Celebrities", "pk":3 }, { "cnt":1, "name":"Female", "pk":2 }, { "cnt":1, "name":"Language", "pk":8 }, { "cnt":1, "name":"Male", "pk":1 }, { "cnt":1, "name":"Region", "pk":9 } ] 

Tutorial’s JSON (Named Array)

 { "earthquakes":[ { "eqid":"c0001xgp", "magnitude":8.8, "lng":142.369, "src":"us", "datetime":"2011-03-11 04:46:23", "depth":24.4, "lat":38.322 }, { "eqid":"c000905e", "magnitude":8.6, "lng":93.0632, "src":"us", "datetime":"2012-04-11 06:38:37", "depth":22.9, "lat":2.311 }, { "eqid":"2007hear", "magnitude":8.4, "lng":101.3815, "src":"us", "datetime":"2007-09-12 09:10:26", "depth":30, "lat":-4.5172 }, { "eqid":"c00090da", "magnitude":8.2, "lng":92.4522, "src":"us", "datetime":"2012-04-11 08:43:09", "depth":16.4, "lat":0.7731 }, { "eqid":"2007aqbk", "magnitude":8, "lng":156.9567, "src":"us", "datetime":"2007-04-01 18:39:56", "depth":10, "lat":-8.4528 }, { "eqid":"2007hec6", "magnitude":7.8, "lng":100.9638, "src":"us", "datetime":"2007-09-12 21:49:01", "depth":10, "lat":-2.5265 }, { "eqid":"a00043nx", "magnitude":7.7, "lng":100.1139, "src":"us", "datetime":"2010-10-25 12:42:22", "depth":20.6, "lat":-3.4841 }, { "eqid":"2010utc5", "magnitude":7.7, "lng":97.1315, "src":"us", "datetime":"2010-04-06 20:15:02", "depth":31, "lat":2.3602 }, { "eqid":"2009mebz", "magnitude":7.6, "lng":99.9606, "src":"us", "datetime":"2009-09-30 08:16:09", "depth":80, "lat":-0.7889 }, { "eqid":"2009kdb2", "magnitude":7.6, "lng":92.9226, "src":"us", "datetime":"2009-08-10 17:55:39", "depth":33.1, "lat":14.0129 } ] } 

En el tutorial, basado en las respuestas de @MDΓΓ БДLL y @Cody Caughlan, pude volver a formatear JSONFunctions.getJSONFromURL en un JSONArray en lugar de un JSONObject. Aquí está mi código de trabajo modificado, ¡gracias!

 public class JSONfunctions { public static JSONArray getJSONfromURL(String url){ InputStream is = null; String result = ""; JSONArray jArray = null; HttpClient httpclient = new DefaultHttpClient(); HttpGet httpget = new HttpGet(url); HttpResponse response = httpclient.execute(httpget); HttpEntity entity = response.getEntity(); is = entity.getContent(); BufferedReader reader = new BufferedReader(new InputStreamReader(is,"iso-8859-1"),8); StringBuilder sb = new StringBuilder(); String line = null; while ((line = reader.readLine()) != null) { sb.append(line + "\n"); } is.close(); result=sb.toString(); jArray = new JSONArray(result); return jArray; } } 

No necesita llamar a json.getJSONArray() , porque el JSON con el que está trabajando ya es una matriz. Entonces, no construyas una instancia de JSONObject ; usa un JSONArray . Esto debería ser suficiente:

 // ... JSONArray json = new JSONArray(result); // ... for(int i=0;i map = new HashMap(); JSONObject e = json.getJSONObject(i); map.put("id", String.valueOf(i)); map.put("name", "Earthquake name:" + e.getString("eqid")); map.put("magnitude", "Magnitude: " + e.getString("magnitude")); mylist.add(map); } 

No puede usar exactamente los mismos métodos que en el tutorial, porque el JSON con el que está tratando necesita ser analizado en un JSONArray en la raíz, no en un JSONObject .

JSONArray tiene un constructor que toma una fuente String (se supone que es una matriz).

Entonces algo como esto

 JSONArray array = new JSONArray(yourJSONArrayAsString); 

Supuse que un JSONArray con nombre es un JSONObject y accedí a los datos del servidor para rellenar un GridView de Android. Por lo que vale mi método es:

 private String[] fillTable( JSONObject jsonObject ) { String[] dummyData = new String[] {"1", "2", "3", "4", "5", "6", "7","1", "2", "3", "4", "5", "6", "7","1", "2", "3", "4", "5", "6", "7", }; if( jsonObject != null ) { ArrayList data = new ArrayList(); try { // jsonArray looks like { "everything" : [{}, {},] } JSONArray jsonArray = jsonObject.getJSONArray( "everything" ); int number = jsonArray.length(); //How many rows have got from the database? Log.i( Constants.INFORMATION, "Number of ows returned: " + Integer.toString( number ) ); // Array elements look like this //{"success":1,"error":0,"name":"English One","owner":"Tutor","description":"Initial Alert","posted":"2013-08-09 15:35:40"} for( int element = 0; element < number; element++ ) { //visit each element JSONObject jsonObject_local = jsonArray.getJSONObject( element ); // Overkill on the error/success checking Log.e("JSON SUCCESS", Integer.toString( jsonObject_local.getInt(Constants.KEY_SUCCESS) ) ); Log.e("JSON ERROR", Integer.toString( jsonObject_local.getInt(Constants.KEY_ERROR) ) ); if ( jsonObject_local.getInt( Constants.KEY_SUCCESS) == Constants.JSON_SUCCESS ) { String name = jsonObject_local.getString( Constants.KEY_NAME ); data.add( name ); String owner = jsonObject_local.getString( Constants.KEY_OWNER ); data.add( owner ); String description = jsonObject_local.getString( Constants.KEY_DESCRIPTION ); Log.i( "DESCRIPTION", description ); data.add( description ); String date = jsonObject_local.getString( Constants.KEY_DATE ); data.add( date ); } else { for( int i = 0; i < 4; i++ ) { data.add( "ERROR" ); } } } } //JSON object is null catch ( JSONException jsone) { Log.e( "JSON EXCEPTION", jsone.getMessage() ); } dummyData = data.toArray( dummyData ); } return dummyData; 

}

Aquí hay una solución bajo 19API lvl:

  • Ante todo. Haz un obj Gson. -> Gson gson = new Gson();

  • El segundo paso es obtener su jsonObj como cadena con StringRequest (en lugar de JsonObjectRequest)

  • El último paso para obtener JsonArray …

YoursObjArray[] yoursObjArray = gson.fromJson(response, YoursObjArray[].class);