Java按条件为JSONArray追加null的实现需求求助
问题:调整学生成绩统计JSON数据格式以符合固定长度数组要求
需求说明
需要生成固定长度(max_count=5)的JSON数据结构,分别对应及格(Passed)和不及格(Failed)学生的成绩数组,具体规则如下:
不及格(Failed)数据数组规则
- 若不及格学生数 < 5:在数组开头补充
null,直到数组长度为5 - 若不及格学生数 ≥ 5:保留最新的5条数据(按
studentID降序排序) - 若无不及格学生:数组全部填充
null
及格(Passed)数据数组规则
- 需在数组末尾补充
null,保持总长度为5;补充的null数量需匹配对应不及格数据的有效长度(最终数组长度固定为5) - 若无不及格学生且及格学生数 ≥5:保留最新的5条数据(按
studentID降序排序) - 若无及格学生:数组全部填充
null
当前代码问题
当前代码在遍历学生时,每次都会新建JSONArray并仅添加单个学生成绩,导致最终data数组长度无限制,且完全没有实现规则中要求的null填充、数据截断和排序逻辑。
修改后的代码实现
以下是调整后的Java代码(基于org.json库),完全符合需求规则:
import org.json.JSONArray; import org.json.JSONObject; import java.util.Collections; import java.util.Comparator; import java.util.List; public class StudentDataFormatter { public static void formatStudentData(List<StudentCategory> studentAgeCategoryList, StudentManager manager) { int max_count = 5; for (StudentCategory studentCategory : studentAgeCategoryList) { // 处理不及格学生数据 List<Student> studentFailed = manager.getFailedStudent(studentCategory.getCategoryId()); JSONObject failedData = new JSONObject(); JSONArray failedDataArray = processFailedData(studentFailed, max_count); failedData.put("name", studentCategory.getCategoryName() + "Failed"); failedData.put("data", failedDataArray); // 处理及格学生数据 List<Student> studentPassed = manager.getPassStudent(studentCategory.getCategoryId()); JSONObject passedData = new JSONObject(); JSONArray passedDataArray = processPassedData(studentPassed, studentFailed.size(), max_count); passedData.put("name", studentCategory.getCategoryName() + "Passed"); passedData.put("data", passedDataArray); // 可将failedData和passedData加入最终结果集合,比如: // resultList.add(failedData); // resultList.add(passedData); } } /** * 处理不及格学生数据,生成符合规则的JSONArray */ private static JSONArray processFailedData(List<Student> failedStudents, int maxCount) { JSONArray dataArray = new JSONArray(); int studentCount = failedStudents.size(); if (studentCount == 0) { // 无不及格学生,全填充null for (int i = 0; i < maxCount; i++) { dataArray.put(JSONObject.NULL); } return dataArray; } // 按studentID降序排序,取最新的maxCount条 Collections.sort(failedStudents, Comparator.comparingInt(Student::getStudentID).reversed()); List<Student> targetStudents = studentCount >= maxCount ? failedStudents.subList(0, maxCount) : failedStudents; // 数据量小于maxCount时,开头补null int nullCount = maxCount - targetStudents.size(); for (int i = 0; i < nullCount; i++) { dataArray.put(JSONObject.NULL); } // 添加有效成绩数据 for (Student student : targetStudents) { dataArray.put(student.getTotalMark()); } return dataArray; } /** * 处理及格学生数据,生成符合规则的JSONArray */ private static JSONArray processPassedData(List<Student> passedStudents, int failedStudentCount, int maxCount) { JSONArray dataArray = new JSONArray(); int passedCount = passedStudents.size(); if (passedCount == 0) { // 无及格学生,全填充null for (int i = 0; i < maxCount; i++) { dataArray.put(JSONObject.NULL); } return dataArray; } // 按studentID降序排序 Collections.sort(passedStudents, Comparator.comparingInt(Student::getStudentID).reversed()); List<Student> targetStudents; if (failedStudentCount == 0) { // 无不及格学生且及格数≥maxCount,取前maxCount条 targetStudents = passedCount >= maxCount ? passedStudents.subList(0, maxCount) : passedStudents; } else { // 有效数据数量为maxCount - 不及格有效数,剩下的末尾补null int validPassedCount = maxCount - Math.min(failedStudentCount, maxCount); targetStudents = passedCount >= validPassedCount ? passedStudents.subList(0, validPassedCount) : passedStudents; } // 添加有效成绩数据 for (Student student : targetStudents) { dataArray.put(student.getTotalMark()); } // 末尾补null至maxCount长度 int nullCount = maxCount - targetStudents.size(); for (int i = 0; i < nullCount; i++) { dataArray.put(JSONObject.NULL); } return dataArray; } // 假设的实体类,可根据实际项目调整 static class StudentCategory { private int categoryId; private String categoryName; public int getCategoryId() { return categoryId; } public String getCategoryName() { return categoryName; } } static class Student { private int studentID; private int totalMark; public int getStudentID() { return studentID; } public int getTotalMark() { return totalMark; } } static class StudentManager { public List<Student> getPassStudent(int categoryId) { return null; } public List<Student> getFailedStudent(int categoryId) { return null; } } }
代码说明
- 拆分处理逻辑:将及格和不及格数据的处理拆分为独立方法,提升代码可读性和可维护性
- 排序逻辑:对学生列表按
studentID降序排序,确保取到最新的学生数据 - 严格遵循规则:
- 不及格数据:不足5条时开头补
null,超过5条时截断为最新5条 - 及格数据:根据不及格数据的数量调整有效数据长度,末尾补
null至5条;无不及格数据时按规则处理截断或填充
- 不及格数据:不足5条时开头补
- 空值处理:使用
JSONObject.NULL确保JSON输出的null符合标准格式
内容的提问来源于stack exchange,提问作者daisy
相关产品推荐
相关产品推荐

