Get JSONArray without array name?

AndroidArraysJson

Android Problem Overview


I'm new to JSON and trying this tutorial: http://p-xr.com/android-tutorial-how-to-parse-read-json-data-into-a-android-listview/#comments

I'm new to JSON, C languages, Java and also Android, but am learning. The tutorial uses what I'm calling a named array, but all of the JSON i'm going to be using in my android project will use simple table rows with no named array. Examples of the JSON i'm using and the earthquake json from the tutorial are below.

The tutorial iterates through the earthquake array and converts into a JAVA hashmap list using the following code:

JSONArray  earthquakes = json.getJSONArray("earthquakes");
    for(int i=0;i<earthquakes.length();i++){						
        HashMap<String, String> map = new HashMap<String, String>();	
        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);			
}

My question is, how can I use json.getJSONArray("") if my JSON is just simple as below? I can convert the rest of the code, I just need to know how to load that JSON using the getJSONArray("strJsonArrayName") if I don't have a strJsonArrayName.

My JSON (UnNamed Array)

[  {    "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
    }
  ]
}

In the tutorial, based on the answers from @MДΓΓ БДLL and @Cody Caughlan , I was able to reformat the JSONFunctions.getJSONFromURL into a JSONArray instead of a JSONObject. Here is my modified working code, thank you!

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;
}
}

Android Solutions


Solution 1 - Android

You don't need to call json.getJSONArray() at all, because the JSON you're working with already is an array. So, don't construct an instance of JSONObject; use a JSONArray. This should suffice:

// ...
JSONArray json = new JSONArray(result);
// ...

for(int i=0;i<json.length();i++){                        
    HashMap<String, String> map = new HashMap<String, String>();    
    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);            
}

You can't use exactly the same methods as in the tutorial, because the JSON you're dealing with needs to be parsed into a JSONArray at the root, not a JSONObject.

Solution 2 - Android

JSONArray has a constructor which takes a String source (presumed to be an array).

So something like this

JSONArray array = new JSONArray(yourJSONArrayAsString);

Solution 3 - Android

I've assumed a named JSONArray is a JSONObject and accessed the data from the server to populate an Android GridView. For what it is worth my method is:

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<String> data = new ArrayList<String>();
      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;

}

Solution 4 - Android

Here is a solution under 19API lvl:

  • First of all. Make a Gson obj. --> Gson gson = new Gson();

  • Second step is get your jsonObj as String with StringRequest(instead of JsonObjectRequest)

  • The last step to get JsonArray...

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

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionRickyView Question on Stackoverflow
Solution 1 - AndroidMatt BallView Answer on Stackoverflow
Solution 2 - AndroidCody CaughlanView Answer on Stackoverflow
Solution 3 - AndroidG O'RillaView Answer on Stackoverflow
Solution 4 - AndroidPéter HidvégiView Answer on Stackoverflow