【问题标题】:Need to change my code to generate Correct JSON from Java Object - Jackson需要更改我的代码以从 Java 对象生成正确的 JSON - Jackson
【发布时间】:2017-08-21 12:38:35
【问题描述】:

我有以下查询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)

StudentsDetails.java:

@Entity(name = "com.StudentDetails")
public class StudentDetails extends AbstractPersistable<Long> {

  private long studentId;
  private String name;
  private long points;
  private String courseName;
  private long courseId;

  public StudentDetails(long studentId, String name, long points, String courseName, long courseId) {
    this.studentId = studentId;
    this.name = name;
    this.points = points;
    this.courseName = courseName;
    this.courseId = courseId;
  }

  public long getStudentId() {
    return studentId;
  }

  public String getName() {
    return name;
  }

  public long getPoints() {
    return points;
  }

  public String getCourseName() {
    return courseName;
  }

  public long getCourseId() {
    return courseId;
  }
}

我想生成一个 JSON 字符串,例如:

{
  "items": [
    {
      "id": "123",
      "students": [
        {
          "name": 'Matt',
          "points": 3000,
          "course_name": 'Science',
          "course_id": 10
        }
      ]
    },
    {
      "id": "324",
      "students": [
        {
          "name": 'Charley',
          "points": 12348,
          "course_name": Science,
          "course_id": 20
        }
      ]
    },   
    {
      "id": "898",
      "error": {
        "error_code": "500",
        "error_message": "Details not found"
        }
    }
  ]
}

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

    for (int i = 0; i < studentDetails.size(); i++) {
      Details details = new Details();
      details.setName(studentDetails.get(i).getName());
      details.setPoints(studentDetails.get(i).getPoints());
      details.setCourseName(studentDetails.get(i).getCourseName());
      details.setCourseId(studentDetails.get(i).getCourseId());
      Listdetails.add(details);
      item.setListDetails(Listdetails);
   }
   response = mapper.writeValueAsString(item);

上面的代码会打印错误的 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}]}]}

而不是

{"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。 (注意:这不是真正的代码 - 只是真实代码的一个示例)

简而言之:我想从数据库表中读取条目并将其设置为:

items array -> [
            0th index : student_id, other related details (1107,['Matt',3000,'Science',10]
            1st index : student_id, other related details(1108,['Charley',12348,'Science',20]
              ]

【问题讨论】:

  • 什么是详细信息?一门课程?什么是物品?
  • 为什么学生有课程名称?
  • JSON 性能不佳,因为创建列表时只有一个学生在其中,因此不需要。生成的 JSON 基本上是相当不错的。您当然可以在学生之前添加一个 ID。要么改变你的DetailsObject 来保存一个ID,要么创建一个Wrapper POJO 来保存这些值。还要想想莫里斯的疑惑和问题。他们似乎很可疑。
  • 你的表student好像没有规范化
  • 它不是真正的代码,但工作方式相同。我只是简单地给出了课程名称而不是我的真实代码

标签: java json jackson jackson-databind


【解决方案1】:

首先,在您的 Json 中,您应该使用双引号 (") 以使 json 有效。 最后你应该使用 Jackson 2.x 库。这是一种更简洁的操作和生成 json 格式数据的方法。您可以在下面找到一种可能的实现方式:

-----------------------------------com.example.Error.java------------------- 

package com.example;

import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.annotation.JsonPropertyOrder;

@JsonInclude(JsonInclude.Include.NON_NULL)
@JsonPropertyOrder({
"error_code",
"error_message"
})
public class Error {

@JsonProperty("error_code")
public String errorCode;
@JsonProperty("error_message")
public String errorMessage;

}
-----------------------------------com.example.Example.java----------------

package com.example;

import java.util.List;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.annotation.JsonPropertyOrder;

@JsonInclude(JsonInclude.Include.NON_NULL)
@JsonPropertyOrder({
"items"
})
public class Example {

@JsonProperty("items")
public List<Item> items = null;

}
-----------------------------------com.example.Item.java--------------------
package com.example;

import java.util.List;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.annotation.JsonPropertyOrder;

@JsonInclude(JsonInclude.Include.NON_NULL)
@JsonPropertyOrder({
"id",
"students",
"error"
})
public class Item {

@JsonProperty("id")
public String id;
@JsonProperty("students")
public List<Student> students = null;
@JsonProperty("error")
public Error error;

}
-----------------------------------com.example.Student.java-----------------

package com.example;

import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.annotation.JsonPropertyOrder;

@JsonInclude(JsonInclude.Include.NON_NULL)
@JsonPropertyOrder({
"name",
"points",
"course_name",
"course_id"
})
public class Student {

@JsonProperty("name")
public String name;
@JsonProperty("points")
public Integer points;
@JsonProperty("course_name")
public String courseName;
@JsonProperty("course_id")
public Integer courseId;

} 

【讨论】:

  • 问题是这样的:我必须得到一个数组 -> 第 0 个索引将是 2 个条目 - id,一个其他详细信息的数组。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-02-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多