奇怪的结果!!!是因为json吗?或者是什么?

时间:2016-02-06 17:50:09

标签: android json

我有一个名为 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 部分! ! (见图)

the result of the two Log.e

发生了什么事?为什么会这样?

1 个答案:

答案 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));
}