0

Here is my JSON:

{
    "error": false,
    "message": "Request successfully completed",
    "linemanques": [
        {
            "quesnum": 1,
            "questype": 1,
            "question": "This is question #1",
            "ans1": "This is answer 1",
            "ans2": "This is answer 2\r\n",
            "ans3": "This is answer 3\r\n\r\n\r\n",
            "ans4": "This is answer 4",
            "correctans": "ans4",
            "notes": "This is a note",
            "category": "2",
            "flag": "ans4"
        },
        {
            "quesnum": 2,
            "questype": 2,
            "question": "This is question #2",
            "ans1": "This is Q2 ans 1",
            "ans2": "This is Q2 ans2",
            "ans3": "This is Q2 ans3",
            "ans4": "This is Q2 ans4",
            "correctans": "ans2",
            "notes": "This is Q2 note 1",
            "category": "5",
            "flag": "ans2"
        },
        {
            "quesnum": 3,
            "questype": 6,
            "question": "The full load current for a three phase motor is found in _____.",
            "ans1": "Table 430.248",
            "ans2": "Table 430.250",
            "ans3": "Table 430.249",
            "ans4": "Table 430.247",
            "correctans": "ans2",
            "notes": "Article 430 2017 NEC",
            "category": "5",
            "flag": "ans2"
        },
        {
            "quesnum": 7,
            "questype": 2,
            "question": " how many",
            "ans1": "isi",
            "ans2": "thiis\\r\\n",
            "ans3": "yes",
            "ans4": "no",
            "correctans": "yes",
            "notes": "refer back to yes",
            "category": "0",
            "flag": "yes"
        },
        {
            "quesnum": 8,
            "questype": 2,
            "question": " how many",
            "ans1": "isi",
            "ans2": "thiis",
            "ans3": "yes",
            "ans4": "no",
            "correctans": "yes",
            "notes": "refer back to yes",
            "category": "0",
            "flag": "yes"
        },
        {
            "quesnum": 9,
            "questype": 2,
            "question": "How many apples can I eat in one day?",
            "ans1": "42 apples",
            "ans2": "6 apples",
            "ans3": "89 apples",
            "ans4": " 42 oranges",
            "correctans": "ans2",
            "notes": "try eating apples",
            "category": "8",
            "flag": "ans2"
        },
        {
            "quesnum": 10,
            "questype": 2,
            "question": " how many",
            "ans1": "isi",
            "ans2": "thiis\\r\\n\\r\\n\\r\\n",
            "ans3": "yes",
            "ans4": "no",
            "correctans": "yes",
            "notes": "refer back to yes",
            "category": "0",
            "flag": "yes"
        }
    ]
}

This is the for loop I am using to parse the JSONArray and its structural output.

String jsonText = buffer.toString(); // gets what the URL returns as JSON


                JSONObject obj = new JSONObject(jsonText); // using JSONObject to pass to a JSONArray to search for the JSON

                List<List<String>> allInfo = new ArrayList();// list to put all the returned information
                List<String> innerList = new ArrayList();
                JSONArray linemanques = obj.getJSONArray("linemanques"); //selects the array to read from


                for (int i = 0; i < linemanques.length(); i++) {
                    JSONObject questionParts = linemanques.getJSONObject(i);
                    quesnum = questionParts.getString("quesnum"); // all of questionParts.getString() are for getting the data in the JSONArray
                    questype = questionParts.getString("questype");
                    question = questionParts.getString("question");
                    ans1 = questionParts.getString("ans1");
                    ans2 = questionParts.getString("ans2");
                    ans3 = questionParts.getString("ans3");
                    ans4 = questionParts.getString("ans4");
                    correctans = questionParts.getString("correctans");
                    category = questionParts.getString("category");
                    notes = questionParts.getString("notes");
                    flag = questionParts.getString("flag");

                    innerList.add(quesnum);
                    innerList.add(questype);
                    innerList.add(question);
                    innerList.add(ans1);
                    innerList.add(ans2);
                    innerList.add(ans4);
                    innerList.add(correctans);
                    innerList.add(category);
                    innerList.add(notes);
                    innerList.add(flag);

                    allInfo.add(innerList);
                }

                return innerList;

Output:

allInfo {
    innerList {
        JSONObject
        JSONObject
        JSONObject //now just imagine 67 more of these per every innerList
    }
    innerList {
        JSONObject
        JSONObject
        JSONObject 
    }
    innerList {
        JSONObject
        JSONObject
        JSONObject
    }
    innerList {
        JSONObject
        JSONObject
        JSONObject
    }
    innerList {
        JSONObject
        JSONObject
        JSONObject 
    }
    innerList {
        JSONObject
        JSONObject
        JSONObject 
    }
    innerList {
        JSONObject
        JSONObject
        JSONObject 
    }
}

What is happening is that instead of taking the first 10 elements in the array and putting it in its own innerList, it takes all 70 and puts them in every innerList. Each innerList should only have 10 elements total. So that means if this gets fixed across all 7 innerLists there will be 70 questions in total.

So what do I need to do so that it would only parse through the first section of the JSONArray? Is there some method included that I am forgetting?

jaySON
  • 15
  • 4
  • You are adding new elements to SAME `List innerList` all the time, and then you are adding that exact `innerList` to `allInfo` 10 times. See second part of accepted answer at [Why does my ArrayList contain N copies of the last item added to the list?](https://stackoverflow.com/q/19843506) for description of that problem. – Pshemo Jan 12 '20 at 00:16
  • In short, you need to move `List innerList = new ArrayList();` *inside* the loop. – Pshemo Jan 12 '20 at 00:22
  • Thank you! If you put your comment as an answer I will accept this. – jaySON Jan 12 '20 at 01:28
  • We already have question and answer about this problem so I marked yours as duplicate of that one. There is no need to repeat that answer. Hope you don't mind. – Pshemo Jan 12 '20 at 02:40

0 Answers0