JPA / Jackson - 反序列化时排除字段并在序列化时包含它们

Posted

技术标签:

【中文标题】JPA / Jackson - 反序列化时排除字段并在序列化时包含它们【英文标题】:JPA / Jackson - Exclude fields when deserialize and include them when serialize 【发布时间】:2017-04-27 21:35:27 【问题描述】:

我有一个带有几个字段的 JPA 实体(真实的更复杂)。我通过 REST(POST 在 Spring 控制器中的操作)接收 一些数据,并立即将其存储在 JPA 实体中;我想看看是否有可能在发送请求时排除某些字段,Jackson 将其反序列化并构造对象。但同时我希望在我发回(对象被序列化)响应时包含这些字段。

@Table("key_card")
public final class KeyCard 
  private String username; // Don't want this to be sent as input,
                           // but want to be able to send it back
                           // in the response
  @NotBlank
  private final char[] password;

如果有办法解决这个问题,我只是尽量不要对它进行两次建模(针对请求和响应)。

【问题讨论】:

【参考方案1】:

您可以使用 JSON 视图:http://wiki.fasterxml.com/JacksonJsonView

Class Views 

   static class AlwaysInclude  
   static class OnlyOnSerialize extends AlwaysInclude  


然后在你看来:

@Table("key_card")
public final class KeyCard 

  @JsonView(Views.OnlyOnSerialize.class)
  private String username;

  @JsonView(Views.AlwaysInclude.class)
  @NotBlank
  private final char[] password;

【讨论】:

【参考方案2】:

要仅从 Json 反序列化中排除 Java 对象属性并在序列化期间包含其值,您可以使用 @JsonIgnore@JsonProperty 注释的适当组合。

您尤其应该:

使用@JsonIgnore 注释属性本身 用@JsonIgnore 注释它的set 方法 用@JsonProperty 注释它的get 方法

在这里您可以找到深入的解释和示例:Jackson: using @JsonIgnore and @JsonProperty annotations to exclude a property only from JSON deserialization

【讨论】:

以上是关于JPA / Jackson - 反序列化时排除字段并在序列化时包含它们的主要内容,如果未能解决你的问题,请参考以下文章

当值为“null”时,Jackson 忽略自定义字段反序列化器

详解jackson注解(三)jackson包含属性、忽略属性的注解

jackson序列化和反序列化时,实体类字段名称有大写字母解决办法

如何在 Jackson 中记录 JSON 反序列化

spring/jackson:实现对保存JSON字符串的字段自动序列化和反序列化

使用 Jackson 反序列化:获取 Json 对象设置的字段列表