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

news2024/10/23 22:47:19

前言

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

问题

假设你有一个实体类 User,其中包含一些字段,并且你希望在某些情况下忽略某些字段,或者自定义序列化方式。你在字段上同时使用了 Jackson 或者 Fastjson 的注解,如下所示:

Jackson:
这种情况下,在 controller 层返回给前端,属性忽略注解(@JsonIgnore)和序列化方式注解(@JsonSerialize)是会生效的,但是使用 Fastjson 去序列化的时候就不生效!

import com.alibaba.fastjson.annotation.JSONField;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;

import java.io.Serializable;

public class User implements Serializable {

    private Long id;

    @JsonIgnore
    private String password;

    @JsonSerialize(using = StringSerializer.class)
    private Date createdAt;

}

Fastjson:
这种情况下,在 Fastjson 序列化的时候可以正常处理字段属性忽略和序列方式,但是在 controller 层无效!

import com.alibaba.fastjson.annotation.JSONField;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;

import java.io.Serializable;

public class User implements Serializable {

    private Long id;

    @JSONField(serialize = false, deserialize = false)
    private String password;

    @JSONField(format = "string")
    private Date createdAt;

}

解决方案

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

import com.alibaba.fastjson.annotation.JSONField;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;

import java.io.Serializable;

public class User implements Serializable {

    private Long id;

    @JsonIgnore
    @JSONField(serialize = false, deserialize = false)
    private String password;

    @JsonSerialize(using = StringSerializer.class)
    @JSONField(format = "string")
    private Date createdAt;

}

自定义复合注解

为了在同一个项目中同时支持 Jackson 和 Fastjson,并且避免重复编写相同的注解,我们可以创建自定义注解来实现通用性。

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Retention(RetentionPolicy.RUNTIME)
@Target({ ElementType.FIELD, ElementType.METHOD })
@com.fasterxml.jackson.annotation.JsonIgnore
@com.alibaba.fastjson.annotation.JSONField(serialize = false, deserialize = false)
public @interface IgnoreField {
}

@Retention(RetentionPolicy.RUNTIME)
@Target({ ElementType.FIELD, ElementType.METHOD })
@com.fasterxml.jackson.databind.annotation.JsonSerialize(using = StringSerializer.class)
@com.alibaba.fastjson.annotation.JSONField(format = "string")
public @interface CustomStringSerializer {
}

序列化的时候使用统一的库

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2221928.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

springboot扩展点都有哪些?

在Spring Boot中,扩展点指的是能够自定义或增强Spring Boot功能的机制。这些扩展点允许开发者在Spring Boot的基础设施之上做定制化配置、行为修改或增强。Spring Boot主要有以下几类扩展点: 1. ApplicationRunner 和 CommandLineRunner 这两个接口允许…

网络运输层之(1)TCP连接管理

网络运输层之(1)TCP连接管理 Author: Once Day Date: 2024年10月22日 一位热衷于Linux学习和开发的菜鸟,试图谱写一场冒险之旅,也许终点只是一场白日梦… 漫漫长路,有人对你微笑过嘛… 全系列文章可参考专栏: 通信网络技术_Once-Day的博客…

【四】企业级JavaScript开发开发者控制台

多行输入 通常,当我们向控制台输入一行代码后,按 Enter,这行代码就会立即执行。 如果想要插入多行代码,请按 ShiftEnter 来进行换行。这样就可以输入长片段的 JavaScript 代码了。 总结 开发者工具允许我们查看错误、执行命令、…

【python爬虫课程设计】天气预报——分类数据爬取+数据可视化

一、选题的背景 随着人们对天气的关注逐渐增加,天气预报数据的获取与可视化成为了当今的热门话题,天气预报我们每天都会关注,天气情况会影响到我们日常的增减衣物、出行安排等。每天的气温、相对湿度、降水量以及风向风速是关注的焦点。通过…

【Linux】线程互斥与同步,生产消费模型(超详解)

目录 线程互斥 进程线程间的互斥相关背景概念 数据不一致问题 锁 深度理解锁 原理角度理解: 实现角度理解: 线程同步 条件变量 测试代码 生产消费模型 生产消费模型概念 编写生产消费模型 BlockingQueue (1)创建生产…

Dell服务器导入idrac 授权文件 (适用iDRAC7、iDRAC8、iDRAC9)

iDRAC Enterprise、iDRAC Datacenter 和 CMC Enterprise 的 30 天试用许可证,供熟悉高级功能集,例如使用虚拟控制台等 OpenManage Enterprise Advanced 或 Advanced+ 许可证支持高级功能,例如自动部署、服务器配置合规性和激活可用插件,如 OpenManage Enterprise Power Ma…

MySQL 数据库迁移至达梦 DM8 常见问题

目录 如何让迁移到 DM 的表名大小写和 MySQL 保持一致 MySQL 迁移到 DM 报错:列[NAMES]长度超出定义 MySQL 迁移到 DM 报错:记录超长 索引错误 DM大小写敏感配置 表空间 新建用户 用户与模式的关系 省略模式名的优势 实际操作 如何让迁移到 DM…

知识图谱的概念、特点及应用领域(详解)

目录 什么是知识图谱? 二、特点 三、应用领域 什么是知识图谱? 知识图谱(Knowledge Graph)是一种将知识进行结构化、组织和表示的方法,它利用图形模型表示事物之间的关系和属性。知识图谱通过节点(实体&…

qt QWidget详解

一、概述 QWidget是容器组件,继承自QObject类和QPaintDevice类。能够绘制自己和处理用户输入,是QT中所有窗口组件类的父类,是所有窗口组件的抽象,每个窗口组件都是一个QWidget,QWidget类对象常用作父组件或顶级组件使…

T113 内核中 adbd相关配置1

准备工作 1. 配置 系统:ubuntu24.04docker(ubuntu18.04) 软件vscode, sdk:Tina-linux(BingPi-M2) 2. 构建环境直接使用自带的 source ./build/envsetup.sh lunch 选择 6 编译开启16线程 make -j16boot编译 mboot 打包…

关于jmeter中没有jp@gc - response times over time

1、问题如下: jmeter没有我们要使用的插件 2、解决方法: 选择下面文件,点击应用; 3、问题解决 ps:谢谢观看!!!

力扣 简单 746.使用最小花费爬楼梯

文章目录 题目介绍题解 题目介绍 题解 思路分析: 确定dp数组以及下标的含义:dp[i]的定义为到达第i台阶所花费的最少体力。确定递推公式:可以有两个途径得到dp[i],一个是dp[i-1] 一个是dp[i-2]。dp[i - 1] 跳到 dp[i] 需要花费 d…

玩转springboot之springboot异步执行

springboot异步执行 使用EnableAsync开启异步执行 在接口方法上使用Async注解进行标注,该接口是一个异步接口 自定义异步线程执行器 Configuration public class CustomAsyncConfigurer implements AsyncConfigurer {Overridepublic Executor getAsyncExecutor() {T…

WebGL编程指南 - 颜色与纹理

将顶点的其他(非坐标)数据——如颜色等——传入顶点着色器。 发生在顶点着色器和片元着色器之间的从图形到片元的转化,又称为图元光栅化 (rasterzation process)。 将图像(或称纹理)映射到图形…

C++笔记---哈希表

1. 哈希的概念 哈希(hash)又称散列,是一种组织数据的方式。从译名来看,有散乱排列的意思。 本质就是通过哈希函数把关键字Key跟存储位置建立一个映射关系,查找时通过这个哈希函数计算出Key存储的位置,进行快速查找。 STL中的un…

推荐IDE中实用AI编程插件,目前无限次使用

插件介绍 一款字节跳动推出的“基于豆包大模型的智能开发工具” 以vscode介绍【pycharm等都可以啊】,这个插件提供智能补全、智能预测、智能问答等能力,节省开发时间 直接在IDE中使用,就不用在网页中来回切换了 感觉还可以,响应速…

Excel表格如何修改“打开密码”,简单几步,轻松搞定

在保护Excel文件的安全性时,设置打开密码是常见且有效的方式。然而,有时我们需要修改已经设置的打开密码,以确保文件安全性或更新密码信息。今天小编来分享一下修改Excel文件打开密码的方法,操作简单,一起来看看吧&…

设置OpenAI API的环境变量

获取openai API 密钥 https://platform.openai.com/api-keys 设置环境变量 为什么不在代码中直接写入,而是设置环境变量? 安全性:将 API 密钥存储在环境变量中,而不是直接写在代码中,可以降低泄露密钥的风险。易于…

第二期:第15节,beep 大海

首先是 代码的编写: 里面已经有了解释了。 1 /*2 * main.c3 *4 * Created on: 2023-3-85 * Author: pengdan6 */7 #include "exynos_4412.h"89 void delay_ms(unsigned int num)10 {11 int i,j;12 for(inum; i>0;i--)13 …

『完整代码』坐骑召唤

创建一个按钮 作为召唤/消失坐骑的开关 将预制体放入指定文件夹 命名为Mount01 创建脚本并编写:CallMount.cs using UnityEngine; using UnityEngine.UI; public class CallMount : MonoBehaviour{public Button callBtn;GameObject mountPrefab;GameObject mountIn…