2012-04-15 14 views
57

Sono nuovo di JSON e provare questo tutorial: http://p-xr.com/android-tutorial-how-to-parse-read-json-data-into-a-android-listview/#commentsOttieni JSONArray senza nome di matrice?

Sono nuovo di JSON, linguaggi C, Java e anche Android, ma sto imparando. Il tutorial usa quello che sto chiamando un array con nome, ma tutto il JSON che userò nel mio progetto Android userà semplici righe di tabella senza array con nome. Di seguito sono riportati alcuni esempi del JSON che sto utilizzando e del terremoto json del tutorial.

I itera del tutorial attraverso l'array terremoto e si trasforma in un elenco HashMap Java utilizzando il seguente codice:

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

La mia domanda è, come posso utilizzare json.getJSONArray("") se il mio JSON è proprio semplice come di seguito? Posso convertire il resto del codice, ho solo bisogno di sapere come caricare quel JSON usando il getJSONArray("strJsonArrayName") se non ho uno strJsonArrayName.

mio JSON (Array senza nome)

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

JSON di Tutorial (nome 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 
    } 
    ] 
} 

Nel tutorial, sulla base delle risposte da @ MДΓΓ БДLL e @Cody Caughlan, sono stato in grado per riformattare JSONFunctions.getJSONFromURL in un JSONArray anziché in un JSONObject. Ecco il mio codice di lavoro modificato, grazie!

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

risposta

117

Non c'è bisogno di chiamare json.getJSONArray() a tutti, perché il JSON si sta lavorando con il già è un array. Quindi, non creare un'istanza di JSONObject; utilizzare un JSONArray. Questo dovrebbe essere sufficiente:

// ... 
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);    
} 

Non è possibile utilizzare esattamente gli stessi metodi come nel tutorial, perché il JSON hai a che fare con le esigenze di essere analizzato in un JSONArray alla radice, non un JSONObject.

+1

OK, ho capito. Ho convertito il metodo getJSONObject in un metodo getJSONArray in questo modo e ho anche cambiato il suo httpPost in un httpGet e ora funziona! Grazie! – Ricky

+0

semplice e utile ... grazie !!! – dd619

+0

Può dirmi in che modo viene mostrato tale risultato? JSONArray json = new JSONArray (result); – Sharath

2

JSONArray ha un costruttore che richiede una sorgente String (presume essere un array).

Quindi, qualcosa di simile

JSONArray array = new JSONArray(yourJSONArrayAsString); 
+0

esattamente, ma la mia JSON non ha un nome di matrice. Cosa inserisco in yourJSONArrayAsString? Stai dicendo che dovrei passare l'intera stringa di output JSON come parametro? – Ricky

+0

OK, penso di avere quello che stai dicendo, per favore conferma: io uso il nuovo JSONArray che stai citando come parametro invece di "terremoti" – Ricky

+0

@Ricky che non è proprio corretto. È necessario il metodo 'getJSONfromURL()' per restituire un 'JSONArray', non un' JSONObject'. –

0

Ho assunto un JSONArray denominato è un oggetto JSONObject e ho accesso ai dati dal server per popolare un GridView Android. Per quello che vale il mio metodo è:

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; 

}

0

Ecco una soluzione sotto 19API lvl:

  • Prima di tutto. Crea un obj di Gson. ->Gson gson = new Gson();

  • Secondo passo è ottenere il vostro jsonObj as String con StringRequest (invece di JsonObjectRequest)

  • L'ultimo passo per ottenere JsonArray ...

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

Problemi correlati