序列化题目记录:Jackson 与 Fastjson 的注解

打印 上一主题 下一主题

主题 1667|帖子 1667|积分 5001

媒介


Java 后端开辟中,我们经常需要处置惩罚 JSON 序列化和反序列化的题目。Spring 框架默认使用 Jackson 作为 JSON 处置惩罚库,但在某些情况下,我们也可能会使用 Fastjson 来处置惩罚特定的序列化需求。由于这两种库的注解不完全兼容,因此在同一个项目中同时使用它们时,可能会遇到一些题目。
题目

假设你有一个实体类 User,其中包含一些字段,而且你盼望在某些情况下忽略某些字段,或者自界说序列化方式。你在字段上同时使用了 Jackson 或者 Fastjson 的注解,如下所示:
Jackson:
这种情况下,在 controller 层返回给前端,属性忽略注解(@JsonIgnore)和序列化方式注解(@JsonSerialize)是会见效的,但是使用 Fastjson 去序列化的时间就不见效!
  1. import com.alibaba.fastjson.annotation.JSONField;
  2. import com.fasterxml.jackson.annotation.JsonIgnore;
  3. import com.fasterxml.jackson.databind.annotation.JsonSerialize;
  4. import java.io.Serializable;
  5. public class User implements Serializable {
  6.     private Long id;
  7.     @JsonIgnore
  8.     private String password;
  9.     @JsonSerialize(using = StringSerializer.class)
  10.     private Date createdAt;
  11. }
复制代码
Fastjson:
这种情况下,在 Fastjson 序列化的时间可以正常处置惩罚字段属性忽略和序列方式,但是在 controller 层无效!
  1. import com.alibaba.fastjson.annotation.JSONField;
  2. import com.fasterxml.jackson.annotation.JsonIgnore;
  3. import com.fasterxml.jackson.databind.annotation.JsonSerialize;
  4. import java.io.Serializable;
  5. public class User implements Serializable {
  6.     private Long id;
  7.     @JSONField(serialize = false, deserialize = false)
  8.     private String password;
  9.     @JSONField(format = "string")
  10.     private Date createdAt;
  11. }
复制代码
办理方案

两种库的注解同时放置到属性字段上

  1. import com.alibaba.fastjson.annotation.JSONField;
  2. import com.fasterxml.jackson.annotation.JsonIgnore;
  3. import com.fasterxml.jackson.databind.annotation.JsonSerialize;
  4. import java.io.Serializable;
  5. public class User implements Serializable {
  6.     private Long id;
  7.     @JsonIgnore
  8.     @JSONField(serialize = false, deserialize = false)
  9.     private String password;
  10.     @JsonSerialize(using = StringSerializer.class)
  11.     @JSONField(format = "string")
  12.     private Date createdAt;
  13. }
复制代码
自界说复合注解

为了在同一个项目中同时支持 Jackson 和 Fastjson,而且制止重复编写雷同的注解,我们可以创建自界说注解来实现通用性。
  1. import java.lang.annotation.ElementType;
  2. import java.lang.annotation.Retention;
  3. import java.lang.annotation.RetentionPolicy;
  4. import java.lang.annotation.Target;
  5. @Retention(RetentionPolicy.RUNTIME)
  6. @Target({ ElementType.FIELD, ElementType.METHOD })
  7. @com.fasterxml.jackson.annotation.JsonIgnore
  8. @com.alibaba.fastjson.annotation.JSONField(serialize = false, deserialize = false)
  9. public @interface IgnoreField {
  10. }
  11. @Retention(RetentionPolicy.RUNTIME)
  12. @Target({ ElementType.FIELD, ElementType.METHOD })
  13. @com.fasterxml.jackson.databind.annotation.JsonSerialize(using = StringSerializer.class)
  14. @com.alibaba.fastjson.annotation.JSONField(format = "string")
  15. public @interface CustomStringSerializer {
  16. }
复制代码
序列化的时间使用统一的库

序列化的时间直接用ObjectMapper就行了,保持和 Spring 整合的 Jackson 统一就行了

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

万有斥力

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表