【问题标题】:Java ArrayList<Class> to JSONArrayJava ArrayList<Class> 到 JSONArray
【发布时间】:2016-08-27 09:55:38
【问题描述】:

我有一个学生的 ArrayList,我想从这个数组创建一个 json 数组。我已经看到使用 ArrayList 完成的示例,但这些在我的情况下不起作用。

我的学生班级有:

String name, lastname;
ArrayList<String> courses;

我尝试了什么:

    JSONObject jsonObject = new JSONObject();
    JSONArray jsonPlayerArray = new JSONArray(Arrays.asList(students));
    jsonObject.put("jsonPlayerArray",jsonPlayerArray);
    System.out.println("AARRRAAYY: " + jsonPlayerArray.toString());
    System.out.println("JSONOBJEEECCCTTT: " + jsonObject.toString());

结果:

AARRRAAYY: [[null,null,null,null]]
JSONOBJEEECCCTTT: {"jsonPlayerArray":[[null,null,null,null]]}

想法是循环遍历我的数组并单独添加它们

使用测试示例更新

调用方法

Test test = new Test(); 
test.addData();

带函数的类

public class Test {
    ArrayList<Student> students = new ArrayList<>();
    ArrayList<String> courseSet = new ArrayList<>();

    public void addData(){
        courseSet.add("Java");
        courseSet.add("CSS");
        courseSet.add("Math");
        courseSet.add("Physics");

        students.add(new Student("Jimmy","sad", courseSet));
        students.add(new Student("Kim","don", courseSet));
        students.add(new Student("Barack","Obama", courseSet));
        createJSON();
    }

    public void createJSON(){
        try {
            List<Student> playerList = students;

            JSONObject jsonplayerObject = new JSONObject();
            JSONArray jsonPlayerArray = new JSONArray(playerList);
            jsonplayerObject.put("jsonPlayerArray", jsonPlayerArray);
            System.out.println("AARRRAAYY: " + jsonplayerObject.toString());


            for (Student s : students) {
                JSONArray jsArray = new JSONArray(s.getCourses());
                JSONObject jsonObject = new JSONObject();
                jsonObject.put("name", s.getName());
                jsonObject.put("lastName", s.getLastname());
                jsonObject.put("courses", jsArray);
                System.out.println("Json for player class: " + jsonObject.toString());
            }


    } catch (JSONException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    }

}

学生班:

public class Student {

    String name, lastname;
    ArrayList<String> courses;

    public Student(String name, String lastname, ArrayList<String> courses) {
        this.name = name;
        this.lastname = lastname;
        this.courses = courses;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getLastname() {
        return lastname;
    }

    public void setLastname(String lastname) {
        this.lastname = lastname;
    }

    public ArrayList<String> getCourses() {
        return courses;
    }

    public void setCourses(ArrayList<String> courses) {
        this.courses = courses;
    }
}

结果:

    AARRRAAYY: {"jsonPlayerArray":[null,null,null]}
Json for player class: {"name":"Jimmy","lastName":"sad","courses":["Java","CSS","Math","Physics"]}
Json for player class: {"name":"Kim","lastName":"don","courses":["Java","CSS","Math","Physics"]}
Json for player class: {"name":"Barack","lastName":"Obama","courses":["Java","CSS","Math","Physics"]}

【问题讨论】:

  • 您的ArrayList 仅包含null 值,当然这是您将收到的结果。投票结束时无法重现。
  • 实际上我确实有值,并且在我遍历学生数组并手动添加它们之后它现在确实有效(请参阅更新)。不确定格式是否正确。我的意思是这会将每个学生都放到 JSONObject 中,然后在下一个循环中它会覆盖前一个学生。问题是这是否是最好的解决方案?
  • 那么您向我们展示了错误的代码开头或错误的结果。如果 students 不包含 5 个 null 值,则您提供的输出是不可能的。请编辑您的问题以反映您的实际代码。
  • 我的学生数组包含 4 个学生,我确实显示了正确的代码。当我通过循环手动添加它们时,它的奇怪原因它工作正常,但是当我使用 List&lt;Student&gt; studentList = students; JSONArray jsonPlayerArray = new JSONArray(studentList); jsonObject.put("jsonPlayerArray",jsonPlayerArray); 时,所有 4 名学生都为空
  • 我根本无法重现您的行为。请提供minimal reproducible example

标签: java android arrays json arraylist


【解决方案1】:
 public JsonArray createJsonArrayStudentList(List<Student> list) {
        JsonArray jsonArray = Json.createArrayBuilder();
        for(Student student: list) {
            jsonArray.add(Json.createObjectBuilder()
                .add("firstname", student.getFirstName())
                .add("lastname", student.getLastName()));
        }
        jsonArray.build();
        return jsonArray;
    }

【讨论】:

  • 很好,但你没有在学生数组中包含课程的数组列表
  • 您使用的是完全不同的 JSON 库。
  • 另外,考虑到他们的 JSON 中的 null,当您尝试在循环的第一次迭代中取消引用 student 时,您的示例将生成 NullPointerException
【解决方案2】:

您应该尝试使用 Gson 首先将其添加到您的依赖项中

compile 'com.google.code.gson:gson:2.4'

试试这个

String json = new Gson().toJson(courses);

【讨论】:

  • 这会有什么不同?
  • 使用字符串 listString = new Gson().toJson(items, new TypeToken>() {}.getType());为我工作
猜你喜欢
  • 2015-01-05
  • 2021-07-16
  • 2016-02-24
  • 2016-07-21
  • 2021-06-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-12
相关资源
最近更新 更多