0
votes

Sorry for the title, I explain.

I'm developing an Android app that use a WebService on Google App Engine. In my WebService I've an ArrayList converted in JSON trough JAX-RS, and the final JSON is something like

{ "lessons" : [ { "name" : "blabla", "prof":"Tom" }, { "name" : "blabla", "prof":"Tom" } ] }

Is this practical or is there a better way?

Then I fetch this JSON from the Android app and convert it in a JSONObject with a snipplet found online:

DefaultHttpClient defaultClient = new DefaultHttpClient();

HttpGet httpGetRequest = new HttpGet(s);

HttpResponse httpResponse = defaultClient.execute(httpGetRequest);

BufferedReader reader = new BufferedReader(new InputStreamReader(httpResponse.getEntity().getContent(), "UTF-8"));

String json = reader.readLine();

JSONObject jsonObject = new JSONObject(json);

How can I get back to my ArrayList?

I've read tons of code and tried to use Gson... This should be easy but I've lost an entire day yesterday..

3

3 Answers

2
votes
  private class Info {
        public String name;
        public String prof;
    }

    ArrayList<Info> arrayList = new ArrayList<Info>();

    JSONArray array = jsonObject.optJSONArray("lessons");
    int len = array.length();

    for (int i = 0; i < len ; i++) {
     JSONObject tmp = array.optJSONObject(i);
     Info info = new Info();
     info.name = tmp.optString("name");
     info.prof = tmp.optString("prof");
      arrayList.add(info)
}

check for mispelling error

0
votes

Download my example from this post. A fully working source code showing how do you convert an object to a json object. Hope it help. How to save an array of simple objects in my android app?

0
votes

If you want to go with the built in JSON-classes, you could do something like this:

DefaultHttpClient defaultClient = new DefaultHttpClient();
HttpGet httpGetRequest = new HttpGet(s);
HttpResponse httpResponse = defaultClient.execute(httpGetRequest);
BufferedReader reader = new BufferedReader(new InputStreamReader(httpResponse.getEntity().getContent(), "UTF-8"));
String json = reader.readLine();
JSONObject jsonObject = new JSONObject(json);
if (jsonObject.has("lessons")) {
    JSONArray jsonLessons = jsonObject.getJSONArray("lessons");
    List<Lesson> lessons = new ArrayList<Lesson>();
    for(int i = 0; i < jsonLessons.length(); i++) {
        JSONObject jsonLesson = jsonLessons.get(i);
        // Use optString instead of get on the next lines if you're not sure
        // the fields are always there
        String name = jsonLesson.getString("name");
        String teacher = jsonLesson.getString("prof");
        lessons.add(new Lesson(name, teacher));
    }
}

Just be sure that your Json always arrives in a single line. Breaking a line would break this code, as you only read the line.

My choice would be Gson. In this case you would create a Lesson class and a Schedule class:

public class Lesson {

    String name;
    String prof;

}

public class Schedule {

    List<Lesson> lessons;
}   

Note that the field names corresponds to the json fields. Feel free make the fields private and add som getter methods if that feels better. :-)

Now you can parse out the Schedule object containing the lessons list with:

DefaultHttpClient defaultClient = new DefaultHttpClient();
HttpGet httpGetRequest = new HttpGet(s);
HttpResponse httpResponse = defaultClient.execute(httpGetRequest);
Reader in = new InputStreamReader(httpResponse.getEntity().getContent(), "UTF-8");

Gson gson = new Gson();
Schedule schedule = gson.fromJson(in, Schedule.class);
List<Lesson> lessons = schedule.lessons;

Hope this helps!