envyM6
envyM6

Reputation: 1237

Retrieving result from JSON to ArrayList

I have the following JSON- enter image description here

  1. journeys
    • {obj} 0
      • [ ] legs
        • {obj} 0
          • {obj} instruction
          • "string" detailed : string value goes here0
        • {obj} 1
          • {obj} instruction
          • "string" detailed : string value goes here1
    • {obj} 1
      • [ ] legs
        • {obj} 0
          • {obj} instruction
          • "string" detailed : string value goes here0
        • {obj} 1
          • {obj} instruction
          • "string" detailed : string value goes here1
    • {obj} 2
      • [ ] legs
        • {obj} 0
          • {obj} instruction
          • "string" detailed : string value goes here0
        • {obj} 1
          • {obj} instruction
          • "string" detailed : string value goes here1

My plan is to iterate through values "journeys" and store them in an ArrayList. Similarly, store "legs" in another ArrayList and finally get retrieve the value for the object instruction. As you can see parent journeys has 3 child {obj} 0, {obj} 1, {obj} 2. I can get the journeys stored using --

ArrayList<JSONObject> journey = new ArrayList<>();
ArrayList<JSONArray> leg = new ArrayList<>();
ArrayList<JSONObject> legDetails = new ArrayList<>();

try {
            JSONArray jArray = object.getJSONArray("journeys");
            if (jArray != null) {
                for (int i=0;i<jArray.length();i++){
                    journey.add(jArray.getJSONObject(i));
                }
                if (!journey.isEmpty()){
                    for (int j=0;j<journey.size();j++){
                         leg.add(journey.get(j).getJSONArray("legs"));
                }
            }
            if (!leg.isEmpty()){
                for (int i = 0; i<leg.size();i++){
                     legDetails.add(leg.get(i).getJSONObject(i));
                    }
            }
          }
        } 
        catch (JSONException e) {
            e.printStackTrace();
        }

Now each journey returns 2 legs and the number changes time to time. I was expecting 6 JSONObject at the end of last for loop but I only get 2 and a out of range exception.

Things to remember: Journey has Routes (Obj 0,1,2). Routes has legs (Obj 0,1). Legs consists of instruction with detail string.

Is this right approach to retrieve the value? and what am I doing wrong?

Upvotes: 0

Views: 89

Answers (1)

Ekansh Rastogi
Ekansh Rastogi

Reputation: 2536

problem is here

        if (!journey.isEmpty()){

          for (int j=0;j<journey.size();j++){
                   leg.add(journey.get(j).getJSONArray("legs"));

                }

        }

journery's have 3 objects.

for j=0 you add journey[0] array to leg
for j=1 you add journey[1] array to leg
for j=2 you add journey[2] array to leg

so legs will have 3 arrays.

if (!leg.isEmpty()){
   for (int i = 0; i<leg.size();i++){
      legDetails.add(leg.get(i).getJSONObject(i));
   }
}

here leg.size()=3;

for i=0 it will add leg[0]'s [0]th element
for i=1 it will add leg[1]'s [1]th element
for i=2 it will add leg[2]'s [2]th element (this is out of range)

update ::

if (!leg.isEmpty()){
   for (int i = 0; i<leg.size();i++){
      for(int j=0;j<leg.get(i).size();j++)
         legDetails.add(leg.get(i).getJSONObject(j));
   }
}

This should help

Upvotes: 2

Related Questions