【问题标题】:Convert Gson Array to Arraylist将 Gson 数组转换为 Arraylist
【发布时间】:2015-05-16 13:25:34
【问题描述】:

我见过很多这样的问题,但是我仍然无法解决这个问题。

我从我的服务器收到了一个包含多个 gson 数组的 json。

如何反序列化来自服务器的响应以满足这些模型。

主题模型:

public class Subject {  
    public int SubjectId;
    public String SubjectName;
    public ArrayList Courses;
}

课程模式:

public class Course {
    public String CourseName;
    public String CourseDescription;
    public int CourseId;
    public int Subject_SubjectId;
}

编辑 这是服务器返回的内容:我使用 google Chrome Extension PostMan 来检索它。

这是实际的

{
"StudentSubject": [
    {
        "SubjectId": 1059,
        "SubjectName": "Accounting",
        "Student_CourseId": 0,
        "UniversitySubjectId": 0,
        "Courses": [
            {
                "CourseId": 1091,
                "CourseName": "ACCT 101",
                "CourseDescription": "",
                "Subject_SubjectId": 1059
            },
            {
                "CourseId": 1092,
                "CourseName": "ACCT 111",
                "CourseDescription": "",
                "Subject_SubjectId": 1059
            },
            {
                "CourseId": 1093,
                "CourseName": "ACCT 115",
                "CourseDescription": "Financial Accounting Foundations",
                "Subject_SubjectId": 1059
            }
        ]
     },
    {
        "SubjectId": 1060,
        "SubjectName": "Mathematics",
        "Student_CourseId": 0,
        "UniversitySubjectId": 0,
        "Courses": [
            {
                "CourseId": 1094,
                "CourseName": "MATH 100",
                "CourseDescription": "Fundamentals of Mathematics",
                "Subject_SubjectId": 1060
            },
            {
                "CourseId": 1095,
                "CourseName": "MATH 101",
                "CourseDescription": "Introduction to Analysis I",
                "Subject_SubjectId": 1060
            },
            {
                "CourseId": 2126,
                "CourseName": "MATH 200",
                "CourseDescription": "Multivariate Calculus",
                "Subject_SubjectId": 1060
            },
            {
                "CourseId": 2132,
                "CourseName": "MATH 102",
                "CourseDescription": "Introduction to Analysis II",
                "Subject_SubjectId": 1060
            }
        ]
    },
    {
        "SubjectId": 1069,
        "SubjectName": "Bioscience & Biotechnology",
        "Student_CourseId": 0,
        "UniversitySubjectId": 0,
        "Courses": [
            {
                "CourseId": 1109,
                "CourseName": "BIO 100",
                "CourseDescription": "Applied Cells, Genetics & Physiology",
                "Subject_SubjectId": 1069
            },
            {
                "CourseId": 2123,
                "CourseName": "BIO 124",
                "CourseDescription": "Evolution & Organismal Diversity",
                "Subject_SubjectId": 1069
            }
        ]
    },
    {
        "SubjectId": 2084,
        "SubjectName": "Computer Science",
        "Student_CourseId": 0,
        "UniversitySubjectId": 0,
        "Courses": [
            {
                "CourseId": 2137,
                "CourseName": "CS 101",
                "CourseDescription": "",
                "Subject_SubjectId": 2084
            }
        ]
    },
    {
        "SubjectId": 2086,
        "SubjectName": "Business Statistics",
        "Student_CourseId": 0,
        "UniversitySubjectId": 0,
        "Courses": [
            {
                "CourseId": 2141,
                "CourseName": "STAT 101",
                "CourseDescription": "",
                "Subject_SubjectId": 2086
            }
        ]
    }
  ]
}

【问题讨论】:

  • public ArrayList Courses; 应该是public ArrayList<Course> Courses;

标签: java android json gson


【解决方案1】:

试试

Type listType = new TypeToken<List<Subject>>() {}.getType();
List<Subject> subjects = new Gson().fromJson(yourJsonString, listType);

你的主题类应该是这样的

class Subject {  
  int SubjectId;
  String SubjectName;
  List<Course> Courses;
}

【讨论】:

  • 在看到您从服务器获取一系列主题后更新了答案
  • 我知道 json 必须是正确的,因为我正在构建一个 android 版本的 ios 应用程序,该应用程序目前在应用商店中。我得到这个错误。致命异常:主要 com.google.gson.JsonSyntaxException:com.google.gson.stream.MalformedJsonException:未终止对象在第 1 行第 136 列路径 $[0].Courses[0].CourseName 我在某处读到我需要将Lenient 设置为true .但那是针对 JsonReader 的,我不知道如何实现它
  • 查看这篇文章,听起来像你在说什么stackoverflow.com/questions/11484353/…
  • 过去从未使用过“宽松”功能,但在阅读了文档google-gson.googlecode.com/svn/trunk/gson/docs/javadocs/com/… 之后,我认为让服务器端的人知道这种行为是个好主意。服务端的响应有点狡猾,如果你非得请读者宽容解析的话。
  • 还向我们提供了一些关于哪些有效哪些无效的反馈,可能对其他访问此网站的人有用;)
【解决方案2】:

您的 json 根本无法验证。

标签需要在" "中,=都需要在:

使用http://www.jslint.com/ 检查其他错误。

您尝试对其进行的任何 json 解析自然会失败。

【讨论】:

  • json 是有效的,我只是通过 log.d(result.get("StudentSubject").toString()); 打印出 json;
【解决方案3】:

正如柏拉图所说,Json 字符串格式不正确,这是我用来测试您想要实现的概念的正确格式。

[{"SubjectId":"1059.0",
  "SubjectName":"Accounting",
  "Student_CourseId":"0.0",
  "UniversitySubjectId":"0.0",
  "Courses":[
        {"CourseId":"1091.0",
         "CourseName":"ACCT 101",
         "CourseDescription":"",
         "Subject_SubjectId":"1059.0"
         },
         {"CourseId":"1092.0",
         "CourseName":"ACCT 111",
         "CourseDescription":"",
         "Subject_SubjectId":"1059.0"
         }
        ]
 }]

这个gson库可以使用后,

    Gson gson = new Gson();
    Subject[] subject = gson.fromJson(jsonString, Subject[].class);
    ArrayList<Course> course = subject[0].Courses;
    System.out.println(subject[0].SubjectId);
    System.out.println(course.get(0).CourseId);

当然,只有当 Json 格式正确时,上述逻辑才会起作用,更正您从服务器收到的 json 响应,然后它应该可以工作。

希望对你有帮助!!!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-09-18
    • 1970-01-01
    • 1970-01-01
    • 2013-04-14
    • 2011-01-09
    • 2020-07-26
    相关资源
    最近更新 更多