java - 如何使用数据库列将 JPA 实体格式化为 JSON?

标签 java jpa

将 JPA 实体转换为不包含相关对象但包含数据库列的 JSON 的最佳方法是什么。

考虑:

public class Question implements Serializable {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Basic(optional = false)
    private Integer id;

    @Basic(optional = false)
    @NotNull
    @Size(min = 1, max = 255)
    @Column(name = "question_title")
    private String questionTitle;

    @Size(max = 500)
    @Column(name = "question_desc")
    private String questionDesc;

    @JoinColumn(name = "requires_question_id", referencedColumnName = "id")
    @ManyToOne
    private Question requiredQuestion;

    ...
}

将问题直接转换为 json 可能如下所示:

{
    "id": 1,
    "questionTitle": "Q1",
    "questionDesc": "A Question 123"
    "requiredQuestion": {
        "id": 2, 
        "questionTitle": "Q2",
        "questionDesc": "A Question 456"
     } 
}

然而,更理想的结果可能如下所示:

{
    "id": 1,
    "question_title": "Q1",
    "question_desc": "A Question 123"
    "required_question_id": 2
}

获得理想结果的最佳方法是什么?

使用“question_title”等字符串键创建 HashMap 并手动分配对象属性,然后将映射转换为 json?

最佳答案

您可以使用Jackson JSON Processor像任何其他 POJO 一样将您的实体序列化为 JSON。要完全控制输出格式,请编写 custom serializer对于 Question 类。它看起来像这样

public class QuestionSerializer extends JsonSerializer<Question> {
    @Override
    public void serialize(Question value, JsonGenerator jgen, SerializerProvider provider) 
      throws IOException, JsonProcessingException {
        jgen.writeStartObject();
        jgen.writeNumberField("id", value.getId());
        jgen.writeStringField("question_title", value.getQuestionTitle());
        jgen.writeStringField("question_desc", value.getQuestionDesc());
        jgen.writeNumberField("required_question_id", value.getRequiredQuestion().getId());
        jgen.writeEndObject();
    }
}

关于java - 如何使用数据库列将 JPA 实体格式化为 JSON?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26823283/

相关文章:

java - JUnit 在没有 @BeforeEach 的情况下创建该类的新实例?

java - maven pom.xml 提示执行无法解析依赖关系但功能正常

java - 获取连接返回的行数超出应有的行数

java - 从 Controller 中的结果集中排除列 | Spring 数据jpa

java - transient 变量的注解@Basic

java - 如何根据Content-type添加响应头;在提交响应之前获取内容类型

java - 检查字符串是否包含数组中的所有字符串

java - 当达到最大链长度时调整哈希表的大小

java - postgresql jpa earth_distance 查询

java - 如何将 JSON 字符串存储为实体的属性