我有一个名为 GradeModel2 的类,它有2个成员:grade(作为字符串)和sections(作为字符串列表)。我正在尝试从我从服务器读取的json字符串中获取 GradeModel2 的数据。
List<GradeModel2> gradeList = new ArrayList<>();
List<String> sectionsList = new ArrayList<>();
JSONObject jo = new JSONObject(json);
JSONArray grades = jo.getJSONArray("grades");
for (int i=0;i<grades.length();i++){
sectionsList.clear();
JSONObject grade = grades.getJSONObject(i);
JSONArray sections = grade.getJSONArray("sections");
Log.e("length",sections.length()+"");
for (int k=0;k<sections.length();k++)
sectionsList.add(sections.getString(k));
gradeList.add(new GradeModel2(grade.getString("grade"), sectionsList));
}
/**************/
for (GradeModel2 grade : gradeList) {
List<String> ss = grade.getSections();
for (String s : ss)
Log.e("section",grade.getGrade()+" : "+s);
}
/**************/
检索到的json字符串如下所示:
{"id":"596","privileges":"T","grades":[{"grade":"1","sections":["A","B","C"]},{"grade":"3","sections":["A","B"]},{"grade":"7","sections":["A"]},{"grade":"9","sections":["B"]},{"grade":"10","sections":["A"]}]}
问题是所有 GradeModel2 对象的部分列表长度 1 且值 A !!! 第一个 Log.e ,内部for循环之前的一行,显示列表第一项的长度 3 ( A , B , C (参见json))。但是,我试图在第二个块的内部for循环中打印每个 GradeModel2 对象的所有部分,但是我看到所有等级的 A 部分! ! (见图)
发生了什么事?为什么会这样?
答案 0 :(得分:1)
您的问题出在sectionsList
。您正在尝试重复使用相同的对象,因此这行代码new GradeModel2(..., sectionsList);
只会添加对同一sectionsList
的引用。由于sectionsList.clear();
,你会看到&#34; A&#34;来自上一个json部分({"grade":"10","sections":["A"]}
)要解决此问题,您必须每次在for循环中创建新数组。像这样:
for (int i = 0 ; i < grades.length() ; i++){
List<String> sectionsList = new ArrayList<>();
// ... your json code here
gradeList.add(new GradeModel2(grade.getString("grade"), sectionsList));
}