json - 使用 Jackson 将 JPA 实体序列化为 JSON

标签 json jakarta-ee jpa ejb jackson

关于 jackson /JPA组合的问题

  • 如果当前应用程序中有大约 20 个实体,并且我在 POM 中添加了 Jackson 依赖项,这是否意味着默认情况下所有实体都准备好转换为 JSON目的?我看到一个示例项目似乎只有注释为 @JsonIgnored 的类被 JSON 跳过.如果是这样,那么这怎么会发生,这种机制的背后是什么?怎么样JACKSON处理那些没有任何 Jackson 注释的实体,默认情况下是否忽略?我一直在网上寻找资源,但运气不佳。
  • 如果 20 个实体中只有一个需要映射到 JSON 对象,是否意味着我必须将 @JsonIgnore 添加到所有其他 19 个实体?如果不是,怎么办Jackson与要工作的实体区分开来?

  • 谢谢。

    最佳答案

    Jackson 和 JPA 彼此没有任何关系。 Jackson 是一个 JSON 解析库,JPA 是一个持久化框架。 Jackson 可以连载 几乎所有 对象 - 唯一的要求是对象具有某种可识别的属性( Javabean type properties ,或用 @JsonProperty 注释的裸字段。反序列化还有一个额外的要求,即目标类型具有默认(无参数)构造函数所以,例如,这是一个 Jackson 可以序列化的对象:

    // Class with a single Javabean property, "name"
    class Person {
        private String name;
    
        public String getName() { return name ; }
        public String setName(String name) { this.name = name ; }
    }
    

    这是另一个:
    // Class with a single field annotated with @JsonProperty
    class Account {
        @JsonProperty("accountNumber")
        private String accountNumber;
    }
    

    这是另一个:
    @Entity
    public class User {
        @Id
        private Long id;
    
        @Basic
        private String userName;
    
        @Basic
        @JsonIgnore
        private String password;
    
        @Basic
        @JsonIgnore
        private Address address;
    
        // Constructors, getters, setters
    }
    

    最后一个示例显示了一个 JPA 实体类 - 就 Jackson 而言,它可以像任何其他类型一样被序列化。 但是 ,注意它的字段:当这个对象被序列化为 JSON 时,两个字段将不会被包含 - 'password' 和 'address'。这是因为它们已被注释为 @JsonIgnore . @JsonIgnore注释允许开发人员说“嘿,可以序列化这个对象,但是当你这样做时,不要在输出中包含这些字段”。此排除仅针对此对象的字段发生,例如,如果您包含 Address另一个类中的字段,但没有将该字段标记为可忽略,它将被序列化。

    防止类型序列化 在所有情况下 ,无论上下文如何,使用 @JsonIgnoreType 注解。当在类型上使用时,它基本上意味着“我不在乎在哪里使用这种类型,从不序列化它”。

    关于json - 使用 Jackson 将 JPA 实体序列化为 JSON,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15975363/

    相关文章:

    java - 如何让 UriBuilder 构建一个带有解码哈希字符的 URI?

    java - 在 jsp 和 Servlet Filter 中获取相同的 session 对象?

    jpa - OneToMany 关系中的 StackoverflowError JPA

    postgresql - 使用表关联时保存多对多关系的策略

    hibernate - 如何在JPA/JPQL中过滤集合?

    javascript - 如何在localstorage中存储一个完整的div

    Javascript console.log 使用变量

    c - 如何从客户端(用 C 编写)接收 int 数组到服务器(用 python 编写)

    java - Spring Web Service REST API JSON 响应始终包含 boolean 值

    jakarta-ee - CommonJ TimerManager 与 EJB3 TimerService