Jackson自定义序列化

Jackson 自定义注解扩展实战 主要是先把解析自定义注解和字段类型的逻辑抽象到基类父用。实现了接口的方法, 先判断是否标记了自定义注解,如果没有标记则走正常的序列化逻辑, 反之则走自定义的序列化逻辑。/*** @param 自定义的序列化注解* @param 序列化的字段类型*//*** 自定义的注解*//*** 序列化的字段类型*//*** 动态决定序列化的方式,以及获取序列化的上下文,比如要序列化的字段的信息等等*/@Override// 子类获取父亲标记的泛型参数。 阅读详情

本篇简单写写Jackson中自定义序列化的方式。

假设有类Country和Leader,分别表示国家以及国家领导人,领导人除了姓名外还有年龄和民族,定义如下

@Data
@NoArgsConstructor
@AllArgsConstructor
public class Country {
    private String countryName;
    private Leader leader;
}
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Leader {
    private String leaderName;
    private Integer age;
    private String nation;
}

基于上述定义,且看下面的代码输出结果结果

@Test
void test5() throws JsonProcessingException {
    ObjectMapper objectMapper = new ObjectMapper();
    Country country = new Country("元朝", new Leader("忽必烈", 79, "蒙古族"));
    System.out.println(objectMapper.writeValueAsString(country));
}

输出结果

{"countryName":"元朝","leader":{"leaderName":"忽必烈","age":79,"nation":"蒙古族"}}

可以看到,正常的序列化方式会将leader的属性都进行序列化。

然而,有些时候,我们并不需要关心这个国家的领导人的详细信息,我们只需要知道他叫什么名字即可,例如我们想在序列化之后输入如下的JSON,那就需要定制序列化方式。

1、自定义序列化器

首先定义一个序列化器,继承自Serializer类或其子类

import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.databind.SerializerProvider;
import com.fasterxml.jackson.databind.ser.std.StdSerializer;
import java.io.IOException;

public class LeaderSerializer extends StdSerializer<Leader> {
    public LeaderSerializer() {
        this(null);
    }

    protected LeaderSerializer(Class<Leader> t) {
        super(t);
    }

    @Override
    public void serialize(Leader value, JsonGenerator gen, SerializerProvider provider) throws IOException {
        if (value == null) {
            gen.writeNull();
            return;
        }
        // 直接输入领导人姓名,不需要起始和结束的花括号
        gen.writeString(value.getLeaderName());
    }
}

有了序列化,自然需要反序列化

import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.DeserializationContext;
import com.fasterxml.jackson.databind.deser.std.StdDeserializer;
import java.io.IOException;

public class LeaderDeserializer extends StdDeserializer<Leader> {
    public LeaderDeserializer() {
        this(null);
    }

    protected LeaderDeserializer(Class<?> vc) {
        super(vc);
    }

    @Override
    public Leader deserialize(JsonParser p, DeserializationContext ctxt) throws IOException, JsonProcessingException {
        String leaderName = p.getValueAsString();
        if (leaderName == null) {
            return null;
        }
        return getLeaderByName(leaderName);
    }

    private Leader getLeaderByName(String leaderName) {
        // TODO 查询数据库或通过其他操作返回leader详细信息
        if ("忽必烈".equals(leaderName)) {
            Leader leader = new Leader();
            leader.setLeaderName(leaderName);
            leader.setAge(79);
            leader.setNation("蒙古族");
            return leader;
        }
        return null;
    }
}

然后应用序列化类,在leader属性上添加序列化和反序列化注解。

注意,不能添加在Leader类上,否则会改变Leader类的默认序列化和反序列化方式,这里序列化的目标依旧是Country

@Data
@NoArgsConstructor
@AllArgsConstructor
public class Country {
    private String countryName;

    @JsonSerialize(using = LeaderSerializer.class)
    @JsonDeserialize(using = LeaderDeserializer.class)
    private Leader leader;
}

测试

@Test
void test6() throws JsonProcessingException {
    ObjectMapper objectMapper = new ObjectMapper();
    Leader leader = new Leader("忽必烈", 79, "蒙古族");
    Country country = new Country("元朝", leader);
    System.out.println(objectMapper.writeValueAsString(leader));
    System.out.println(objectMapper.writeValueAsString(country));
}

输出结果

{"leaderName":"忽必烈","age":79,"nation":"蒙古族"}
{"countryName":"元朝","leader":"忽必烈"}

从输出结果可以看到,Leader的序列化方式依旧是正常的,但是Country中的leader属性序列化后输出的只有leaderName属性,已经实现了我们需要的功能。

再来测试反序列化

@Test
void test7() throws JsonProcessingException {
    ObjectMapper objectMapper = new ObjectMapper();
    String json = "{\"countryName\":\"元朝\",\"leader\":\"忽必烈\"}";
    System.out.println(objectMapper.readValue(json, Country.class));
}

输出结果

Country(countryName=元朝, leader=Leader(leaderName=忽必烈, age=79, nation=蒙古族))

可以看到,结果也是正常的。

2、使用@JsonValue和@JsonCreator注解

首先将上面Country中leader属性上加的序列化注解和反序列化注解去掉,还原为最初,然后修改Leader类如下

@Data
@NoArgsConstructor
@AllArgsConstructor
public class Leader {

    @JsonValue
    private String leaderName;

    private Integer age;
    private String nation;

    @JsonCreator(mode = JsonCreator.Mode.DELEGATING)
    public static Leader getLeaderByName(String leaderName) {
        // TODO 查询数据库或通过其他操作返回leader详细信息
        if ("忽必烈".equals(leaderName)) {
            Leader leader = new Leader();
            leader.setLeaderName(leaderName);
            leader.setAge(79);
            leader.setNation("蒙古族");
            return leader;
        }
        return null;
    }

}

注意:@JsonCreator注解所标注的类必须要是static的

再来执行上面的测试类test6(),输出结果如下

"忽必烈"
{"countryName":"元朝","leader":"忽必烈"}

对比序列化器,可以看到,使用@JsonValue注解已经将Leader类的序列化方式改变了,进而影响了Country类。再来执行test7()测试反序列化,结果与之前是一致的。但是执行下面的反序列化测试的时候却报了错,从报错信息可以看到是JSON识别错误,暂时还未找到解决方法,待后续补充完善。

@Test
void test8() throws JsonProcessingException {
    ObjectMapper objectMapper = new ObjectMapper();
    System.out.println(objectMapper.readValue("忽必烈", Leader.class));
}
com.fasterxml.jackson.core.JsonParseException: Unrecognized token '忽必烈': was expecting (JSON String, Number, Array, Object or token 'null', 'true' or 'false')
 at [Source: (String)"忽必烈"; line: 1, column: 4]

所以更推荐使用自定义序列化器和反序列化器的方式来实现。

SpringBoot中Jackson序列化处理自定义注解 上篇文章 Jackson序列化带有注解的字段的原理浅析 里已经简单介绍了Jackson如何序列化带有注解的字段。 本文尝试自己定义一个注解,让Jackson序列化时对标注了该注解的字段进行脱敏。 阅读详情

相关推荐

Jackson 配置 Bigdecimal 序列化

使用 jackson 配置 BigDecimal 序列化,欢迎阅读斧正。

格物致知,知行合一。 2250

Jackson的自定义序列化器调用默认序列化器详解

将我们完整的数据结构序列化为JSON时使用所有字段的精确一对一表示有时可能不合适,或者根本可能不是我们想要的。 相反,我们可能想要创建数据的扩展或简化视图。 这就是自定义 Jackson 序列化程序发挥作用的地方。

白石的专栏 5168

spring boot 中jackson自定义序列化和反序列化

spingmvc使用httpmessageconverter接口来转换http请求和响应。 如果需要添加和自定义转换器,则可以使用spring boot的HttpMessageConverters类;任何存在于上下文忠的HttpMessageConverter的ben都会被添加到转换器列表中。 如果想使用Jackson对json进行序列化和反序列化,则可能需要编写自己的JsonSerializer和JsonDeserializer类。使用spring boot的@JsonComponent注释。使用@J

蔡定努 4300

SpringBoot中Jackson实现自定义序列化和反序列化总结

当需要对特定的类或属性进行自定义的序列化和反序列化控制时,可编写自定义的序列化器(Serializer)和反序列化器(Deserializer)。通过实现 JsonSerializer 和 JsonDeserializer 接口,可以完全控制序列化和反序列化过程中的行为,包括如何读取属性、生成 JSON 或者解析 JSON 等。@Override@Overridetry {// 省略构造和getter/setter方法// 序列化。

huang714的专栏 4172

今天我们要聊的是在 Spring Boot 中如何使用 Jackson 来实现自定义的序列化和反序列化

我们可以编写自定义的序列化器(Serializer)和反序列化器(Deserializer),并通过注册这些序列化器和反序列化器来控制序列化和反序列化的过程。除了上面提到的直接在类级别使用自定义序列化器外,我们还可以通过配置文件或者代码注册的方式,为特定类型注册自定义的序列化器和反序列化器。通过上述方法,我们可以在 Spring Boot 中灵活地控制 Jackson 的序列化和反序列化行为。

java专栏 1055

别再只用三次多项式了!用MATLAB手把手教你搞定七次多项式轨迹规划(附完整代码)

本文详细介绍了七次多项式在轨迹规划中的优势与应用,通过MATLAB实现从理论推导到实际代码的全过程。相比传统的三次多项式,七次多项式能精确控制位置、速度、加速度和加加速度,实现更平滑的运动控制,特别适用于工业机器人和数控机床等高精度场景。文章包含完整的MATLAB代码示例和优化技巧,帮助工程师快速掌握这一高级轨迹规划方法。

weixin_30872337的博客 298

自定义序列化与反序列化的Jackson实践

首先,我们定义一个简单的Java对象,用于表示货币兑换率。这个对象包含货币对、汇率以及最后更新时间。import com// 省略getter和setter方法 }// 省略getter和setter方法 }// 省略getter和setter方法 }// 省略getter和setter方法 }import com// 省略getter和setter方法 }// 省略getter和setter方法 }

m0_74337424的博客 921

QGIS v3.28 高效加载OSM在线地图的三种实用方法

本文详细介绍了在QGIS v3.28中高效加载OSM在线地图的三种实用方法:通过XYZ Tiles直接连接、使用QuickMapServices插件以及配置WMS/WTMS服务。针对每种方法提供了具体操作步骤、常见问题解决方案和性能优化建议,帮助用户根据需求选择最适合的方案,提升GIS工作效率。

weixin_29233333的博客 434

jackson 自定义序列化

对于一直用gson的人来说,如果单独用jackson,真是麻烦了,但还是得小结下了: 先来看下如何自定义把某个对象序列化为json: 先是对象: Java代码  public class User {      public int id;      public String name;  }  public class Item {      public int id;      publi...

七月流星 1205

SpringSecurity(15)——OAuth2密码模式

SpringSecurity Oauth2密码模式

peng_gx的博客 1520

高通camera调试经验总结

修改AF对焦模式 adb shell setprop vendor.debug.camera.af.manual 2 //使能手动对焦 adb shell setprop vendor.debug.camera.af.manual 0 //使能自动对焦

weixin_43381364的博客 1万+

Spring Boot Jackson 自定义JSON序列化和反序列化

1. 序列化 1.1. JsonSerializer序列化父类 1.2. ContextualSerializer序列化上下文 1.3. 自定义序列化注册Jackson 1.3.1. SimpleModule 1.3.2. @JsonSerialize 注解 1.3.3. CustomSerializerFactory 2. 反序列化 2.1. JsonDeserializer序...

小魏的奇妙世界 1万+

stm32f407等芯片(HAL库)时钟频率修改(乱码)

其他片子及库文件未知、未验证,只是在使用stm32f407ZG配置串口打印的时候,出现乱码,就从以下几方面定位问题: 1. 确认串口GPIO相关配置; 2. 确认波特率等参数; 3. 确认时钟频率; 结果这次使用YH的串口打印程序在ZDYZ的开发板调试项目工程(有点另类...),做功能验证,就出现了以上问题,出于好奇开始调试,最终发现是时钟频率问题。 看到下图这个配置,因为ZDYZ开发板使用的是8MHz外部晶振(好像默认的是25MHz,如图2),所以他这里PLL_M是25,不是推荐值,感...

bulefire2009的博客 5516

jackson自定义序列化器

假设你有一个类MyClass,你希望使用自定义的序列化器来序列化它。java代码解读复制代码@JsonSerialize(using = JsonTypeSerializer.class) // 指定自定义序列化器 public class MyClass { private String name;// 必须有无参构造函数 public MyClass() {} // Getter 和 Setter 方法 public String getName() { return name;} }

sc35262的博客 734

【OpenClaw企业级智能体实战】第10篇:医疗行业OpenClaw实战:病历自动书写、医保智能审核与患者随访管理(附HIPAA合规配置+完整代码)

医疗行业正面临“效率提升需求”与“合规监管红线”的双重矛盾:病历书写占据医生30%-50%工作时间,医保审核效率低下,患者随访工作量巨大,但医疗数据“不出域”“责任不转移”的要求又限制了AI落地。本文基于华为云、腾讯云安全规范及中关村科金、复旦大学附属中山医院等真实实践,拆解OpenClaw在医疗场景的五大核心应用(病历自动书写、医保智能审核、患者随访管理、科研文献综述、医学影像预处理),提供私有化部署架构、HIPAA合规配置模板、完整实操流程及可直接运行的代码。

专注于人工智能、软件开发、工控自动化、工厂数字化及智能化等领域,希望和大家共同进步! 441

【AUTOSAR-IpduM】-3.1-配置一个发送Tx Dynamic Container PDU(Multiple-PDU)

手把手教您如何配置一个Tx Dynamic Container PDU(Multiple-PDU),动态容器复用帧。并附上测试LOG帮助您进一步加深理解。

「汽车电子助手」的博客 1770

jackson自定义序列化中null值的处理

参考:【私人定制jackson】定制jackson的自定义序列化(null值的处理)在springboot中使用jackson,返回json数据时输出null值时按照属性类型输出具体形式可以配置其一个MappingJackson2HttpMessageConverter类,这个类同时可以做另一个事情,防止ie对json数据当做文件进行下载。MappingJ...

lpfasd123的博客 8381

CVPR 2026 即插即用 | 注意力篇 | PFG:多尺度大核+像素级频率门控,特征显著增强,精准适配边缘纹理场景

本文提出了一种基于频率引导的轻量级外围门控模块PFG,用于高效时空预测学习。该模块通过多尺度大核分解卷积(1×K + K×1)捕捉外围空间依赖,同时利用固定频率滤波器提取高频线索,动态融合不同尺度的外围特征。核心创新包括:外围聚焦的多尺度空间增强、频率引导的动态融合机制、双阶段归一化协同等。实验表明,PFGNet在多个基准数据集上达到SOTA性能,同时保持较低计算复杂度。该模块可直接嵌入各类视觉模型,适用于需要强化空间-通道协同表达的轻量级任务。

主要更新底层视觉(去噪、超分等)相关的科研内容,形式为【论文精读】+【论文复现】 480

spring boot jackson自定义序列化和反序列化

spingmvc使用httpmessageconverter接口来转换http请求和响应。 如果需要添加和自定义转换器,则可以使用spring boot的HttpMessageConverters类;任何存在于上下文忠的HttpMessageConverter的ben都会被添加到转换器列表中。 如果想使用Jackson对json进行序列化和反序列化,则可能需要编写自己的JsonSerializ...

枫少 5270

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

自定义jackson序列化_Jackson中的自定义反序列化程序和验证

自定义jackson序列化 tl; dr:将输入验证添加到Jackson中的自定义json解串器中很重要。 在RHQ中,我们在几个地方使用了Json解析-直接在as7 / Wildfly插件中,或者通过RESTEasy 2.3.5间接在REST-api中使用,已经很繁重了。 现在,我们有一个bean Link ,看起来像: public class Link { String ...

最佳 Java 编程 976

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

Jackson自定义反序列化

import java.io.IOException; import java.math.BigDecimal; import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util...

唐家麦兜 2274

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

jackson自定义序列化反序列化

序列化主要作用在返回数据的时候以BigDecimal统一返回3位小数为例自定义序列化处理类继承jackson的类,重写serialize方法/**} /*** 保留3位小数} }使用的时候,可以直接使用Jackson的注解接收前端传入数据继承类,重写方法例子:后端传入前端的图片链接,去掉域名,只保存path部分/**// 前端传入数据 String text = jsonParser . getText();

liouwb的博客 1518

jackson–自定义序列化器

1.概述 如何使用自定义序列化器,使用Jackson 2序列化Java实体。 2.对象的标准序列化 定义2个简单实体,看看Jackson如何在没有任何自定义逻辑的情况下序列化这些实体: @Data @AllArgsConstructor @NoArgsConstructor public class User { public int id; public String name; } @Data @AllArgsConstructor @NoArgsConstructor public

盲目的拾荒者的博客 2384

jackson按照自定义注解序列化和反序列化属性

jackson按照自定义注解序列化和反序列化属性

毅香雪海的博客 3317
上一篇: Jackson多态反序列化
下一篇: Spring Schedule如何动态添加修改定时任务
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值