【问题标题】:Generate Correct JSON from Java Object - Jackson从 Java 对象生成正确的 JSON - Jackson
【发布时间】:2017-08-22 12:00:07
【问题描述】:

我有以下查询select * from student where courseName = 'Science';的结果

结果:

student_id | name   | points | course_name   | course_id |
+----------+--------+--------+---------------+-----------+
       1107| Matt   |   3000 |     Science  |    10     |
|      1108| Charley|  12348 |     Science  |    20     |

2 rows in set, 2 warnings (0.00 sec)

部分实现代码目前如下所示:

List<StudentDetails> studentDetailss = StudentDetailsRepository
    .findByCourseId(Request.getCourseId());
List<Student> student = new ArrayList<>();
List<Item> studentList = new ArrayList<>();
Response response = new Response();

for (StudentDetails student : studentDetailss) {
  IndividualItem studentItem = new IndividualItem();
  studentItem.setId(student.getId());

  Offer offer = new Offer();
  offer.setName(studentDetailss.getName());
  offer.setTotalPoints(studentDetailss.getPoints());
  offer.setCourseName(studentDetailss.getCourseName());
  offer.setCourseId(studentDetailss.getCourseId());

  Student.add(offer);
  studentItem.setOfferList(Student);
  studentList.add(studentItem);
  Response.setItems(studentList);
    }

json_text = mapper.writeValueAsString(Response);

上面的代码会打印错误的 JSON,例如:

 {"items":[{"id":"1107","details":[{"name":"Matt", "points":3000,"course_name":"Science","course_id":10},{"name": "Charley",points":12348,"course_name":"Science","course_id":20}]},{"id":"1108","details":[{"name":"Matt", "points":3000,"course_name":"Science","course_id":10},{"name": "Charley",points":12348,"course_name":"Science","course_id":20}]}]}

但我需要生成以下 JSON 而不是上面的:

 {"items":[{"id":"1107","details":[{"name":"Matt", "points":3000,"course_name":"Science","course_id":10}]},{"id":"1108","details":[{"name": "Charley",points":12348,"course_name":"Science","course_id":20}]}]} 

(注意:这不是真正的代码 - 只是代码示例)

【问题讨论】:

  • 上面的代码根本不生成 JSON,你能用你的 [i]actual[/i] 代码更新帖子吗?有些东西必须生成你到达那里的 JSON。此外,这里发生的所有事情都是您获得了两次结果,这不应该是一个需要解决的问题,并且可能来自您获取或保存数据的方式。尝试调试你的循环(或做System.out.println(student.getName())
  • 我已经添加了 JSON 生成的代码 - 它正在使用对象映射器

标签: java json jackson iteration


【解决方案1】:

通过在f​​or循环中初始化数组列表'student'解决了上述问题:

代码更改如下:

List<StudentDetails> studentDetailss = StudentDetailsRepository
    .findByCourseId(Request.getCourseId());
List<Item> studentList = new ArrayList<>();
Response response = new Response();

for (StudentDetails student : studentDetailss) {
  IndividualItem studentItem = new IndividualItem();
  studentItem.setId(student.getId());

  Offer offer = new Offer();
  offer.setName(studentDetailss.getName());
  offer.setTotalPoints(studentDetailss.getPoints());
  offer.setCourseName(studentDetailss.getCourseName());
  offer.setCourseId(studentDetailss.getCourseId());

  Student.add(offer);
  studentItem.setOfferList(Student);
  studentList.add(studentItem);
  Response.setItems(studentList);
    }

json_text = mapper.writeValueAsString(Response);

【讨论】:

  • 这真的有效吗?您的编译器没有抱怨您将 2 个变量命名为“学生”这一事实?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-02-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-28
  • 1970-01-01
相关资源
最近更新 更多