2012-04-15 16 views
57

Ich bin neu in JSON und dieses Tutorial versucht: http://p-xr.com/android-tutorial-how-to-parse-read-json-data-into-a-android-listview/#commentsGet JSONArray ohne Array-Name?

Ich bin neu in JSON, C Sprachen, Java und auch Android, aber lerne. Das Tutorial verwendet, was ich ein benanntes Array nenne, aber alle JSON, die ich in meinem Android-Projekt verwenden werde, werden einfache Tabellenzeilen ohne benanntes Array verwenden. Beispiele für den JSON, den ich benutze, und das Erdbeben json aus dem Tutorial sind unten.

das Tutorial durchläuft die Erdbeben-Array und verwandelt sich in ein JAVA hashmap Liste mit dem folgenden 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);    
} 

Meine Frage ist, wie ich json.getJSONArray("") verwenden können, wenn meine JSON wie unten gerade einfach ist? Ich kann den Rest des Codes konvertieren, ich muss nur wissen, wie dieser JSON mit dem getJSONArray("strJsonArrayName") geladen wird, wenn ich kein strJsonArrayName habe.

Mein JSON (unbenannt 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 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 
    } 
    ] 
} 

Im Tutorial basiert auf den Antworten von @ MДΓΓ БДLL und @Cody Caughlan, konnte ich um die JSONFunctions.getJSONFromURL in ein JSONArray anstelle eines JSONObject neu zu formatieren. Hier ist mein modifizierter Arbeitscode, danke!

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

Antwort

117

Sie brauchen nicht json.getJSONArray() überhaupt zu nennen, weil die JSON Sie mit bereits arbeiten ist ein Array. Also, konstruiere keine Instanz von JSONObject; Verwenden Sie eine JSONArray. Dies sollte ausreichen:

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

Sie können nicht genau die gleichen Methoden wie im Tutorial, weil die JSON Sie mit Bedürfnissen zu tun hat in einem JSONArray an der Wurzel analysiert werden, kein JSONObject.

+1

OK, ich verstehe es. Ich konvertierte die getJSONObject Methode in eine getJSONArray Methode und änderte auch seine httpPost in eine httpGet und es funktioniert jetzt! Danke! – Ricky

+0

einfach und nützlich ... danke !!! – dd619

+0

Können Sie mir sagen, woran das Ergebnis angezeigt wird? JSONArray json = new JSONArray (result); – Sharath

2

JSONArray hat einen Konstruktor, der eine Quelle String nimmt (mutmaßlich ein Array zu sein).

So etwas wie diese

JSONArray array = new JSONArray(yourJSONArrayAsString); 
+0

genau, aber meine JSON nicht über einen Array-Namen. Was lege ich in deinen JSONArrayAsString? Willst du sagen, ich sollte nur meine gesamte JSON-Ausgabe-String als Parameter übergeben? – Ricky

+0

OK, ich denke, ich verstehe, was Sie sagen, bitte bestätigen Sie: Ich benutze das neue JSONArray, das Sie als Parameter anstelle von "Erdbeben" nennen – Ricky

+0

@Ricky das ist nicht ganz richtig. Sie benötigen die Methode 'getJSONfromURL()', um ein 'JSONArray', kein' JSONObject' zurückzugeben. –

0

Ich habe angenommen, dass ein benanntes JSONArray ein JSONObject ist und auf die Daten vom Server zugegriffen hat, um ein Android GridView zu füllen. Für was es wert ist meine Methode ist:

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

Hier ist eine Lösung unter 19API lvl ist:

  • allererst. Mache einen Gson obj. ->Gson gson = new Gson();

  • Zweiter Schritt ist, erhalten Sie Ihre jsonObj als String mit StringRequest (statt JsonObjectRequest)

  • Der letzte Schritt zu bekommen JsonArray ...

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