《SpringBoot篇》26.SpringBoot整合Jackson超详细教程(附Jackson工具类)
创始人
2025-06-01 05:18:19
陈老老老板🦸
👨‍💻本文专栏:SpringBoot篇(主要讲一些与springboot整合相关的内容)
👨‍💻本文简述:本文讲一下Jackson常见用法,超级详细。
👨‍💻上一篇文章:《SpringBoot篇》25.SpringBoot整合ActiveMQ
👨‍💻有任何问题,都可以私聊我,我能帮得上的一定帮忙,感谢大佬们支持。
🦹我认为人人都可以学好编程,我愿意成为你的领路人!(需内推私聊)

在这里插入图片描述

一、Jackson简介

说明:本篇讲的是Jackson的详细用法,Jackson工具类在文章最后,直接复制粘贴即可使用。 Jackson是公司中必用的组件之一,常用的还用阿里的Fastjson,但是由于一些原因bug与漏洞是在是太多,在注重安全的公司直接被pass,还有就是谷歌的Gson(这个没用过不太了解)。 Spring MVC 的默认 json 解析器便是 Jackson。 Jackson 优点很多。 Jackson 所依赖的 jar 包较少 ,简单易用。与其他 Java 的 json 的框架 Gson 等相比, Jackson 解析大的 json 文件速度比较快;Jackson 运行时占用内存比较低,性能比较好;Jackson 有灵活的 API,可以很容易进行扩展和定制。

额外了解:
Jackson 的 1.x 版本的包名是 org.codehaus.jackson
当升级到 2.x 版本时,包名变为com.fasterxml.jackson

Jackson 有三个核心包,分别是 StreamingDatabidAnnotations,通过这些包可以方便的对 JSON 进行操作.

  • jackson-core:核心包,提供基于"流模式"解析的相关 API,它包括 JsonPaser 和 JsonGenerator。 Jackson 内部实现正是通过高性能的流模式 API 的 JsonGenerator 和 JsonParser 来生成和解析 json。
  • jackson-annotations:注解包,提供标准注解功能.
  • jackson-databind :数据绑定包, 提供基于"对象绑定" 解析的相关 API ( ObjectMapper ) 和"树模型" 解析的相关 API (JsonNode);基于"对象绑定" 解析的 API 和"树模型"解析的 API 依赖基于"流模式"解析的 API。包含上面两个包,只导入这个坐标即可。

运行环境:

  • idea2020.2
  • jdk1.8
  • springboot 2.7.9

下载demo:直接去我的资源下载即可(Jackson实例-附工具类)

二、Json简介

说明: 作为Java开发一定要学习Json,在现在的前后端分离的项目中,Json是最常见的数据交换格式。比如SpringBoot中@RequestBody注解就是作为接收Json格式的注解,在使用Postman进行测试时传输的raw-json也是Json格式数据。

JSON表示结构:
对象数组: 对象结构以”{”大括号开始,以”}”大括号结束,中间部分由0或多个以”,”分隔的”key(关键字)/value(值)”对构成,关键字和值之间以”:”分隔,语法结构如代码。这里给一个示例。

{"array": [1,2,3],"boolean": true,"name": "cllb","null": null,"age": 12345,"object": {"height": 100,"color": "红色"},"string": "陈老老老板"
}

三、springboot整合Jackson

1.创建项目

说明: 创建一个空springboot项目(2.7.9版本)。这里就不过多复述了,创建时将lombok组件选上,十分方便无需再写Get/Set方法。
注意:可以看到导入databind包会自动导入剩下两个包。
在这里插入图片描述

2.导入坐标

说明: 可以看到导入databind包会自动导入剩下两个包。

com.fasterxml.jackson.corejackson-databind2.13.3

在这里插入图片描述

3.配置文件

a.配置文件配置

properties格式:

#指定日期格式,比如yyyy-MM-dd HH:mm:ss,或者具体的格式化类的全限定名
spring.jackson.date-format
#指定日期格式化时区,比如America/Los_Angeles或者GMT+10.
spring.jackson.time-zone
#是否开启Jackson的反序列化
spring.jackson.deserialization
#是否开启json的generators.
spring.jackson.generator
#指定Joda date/time的格式,比如yyyy-MM-ddHH:mm:ss). 如果没有配置的话,dateformat会作为backup
spring.jackson.joda-date-time-format
#指定json使用的Locale.
spring.jackson.locale
#是否开启Jackson通用的特性.
spring.jackson.mapper
#是否开启jackson的parser特性.
spring.jackson.parser
#指定PropertyNamingStrategy(CAMEL_CASE_TO_LOWER_CASE_WITH_UNDERSCORES)或者指定PropertyNamingStrategy子类的全限定类名.
spring.jackson.property-naming-strategy
#是否开启jackson的序列化.
spring.jackson.serialization
#指定序列化时属性的inclusion方式,具体查看JsonInclude.Include枚举.
spring.jackson.serialization-inclusion

yml格式:

spring:jackson:#日期格式化date-format: yyyy-MM-dd HH:mm:sstime-zone: GMT+8#设置空如何序列化default-property-inclusion: non_null    serialization:#格式化输出 indent_output: true#忽略无法转换的对象fail_on_empty_beans: falsedeserialization:#允许对象忽略json中不存在的属性fail_on_unknown_properties: falseparser:#允许出现特殊字符和转义符allow_unquoted_control_chars: true#允许出现单引号allow_single_quotes: true

b.自定义配置

说明: 这里直接将Jackson工具类给大家,自定义配置指的就是工具类中,对于object_mapper的set赋值。什么方法都有,演示也直接使用工具类进行。

package com.clllb.jackson.utils;import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.*;
import lombok.extern.slf4j.Slf4j;
import org.springframework.util.StringUtils;import java.io.File;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.List;@Slf4j
public class JacksonUtil {private static final ObjectMapper OBJECT_MAPPER = new ObjectMapper();private static final ObjectMapper OBJECT_MAPPER_SNAKE_CASE = new ObjectMapper();// 日期格式化private static final String STANDARD_FORMAT = "yyyy-MM-dd HH:mm:ss";static {//对象的所有字段全部列入OBJECT_MAPPER.setSerializationInclusion(JsonInclude.Include.ALWAYS);//取消默认转换timestamps形式OBJECT_MAPPER.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);//忽略空Bean转json的错误OBJECT_MAPPER.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false);//所有的日期格式都统一为以下的样式,即yyyy-MM-dd HH:mm:ssOBJECT_MAPPER.setDateFormat(new SimpleDateFormat(STANDARD_FORMAT));//忽略 在json字符串中存在,但是在java对象中不存在对应属性的情况。防止错误OBJECT_MAPPER.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);}static {//对象的所有字段全部列入OBJECT_MAPPER_SNAKE_CASE.setSerializationInclusion(JsonInclude.Include.ALWAYS);//取消默认转换timestamps形式OBJECT_MAPPER_SNAKE_CASE.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);//忽略空Bean转json的错误OBJECT_MAPPER_SNAKE_CASE.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false);//所有的日期格式都统一为以下的样式,即yyyy-MM-dd HH:mm:ssOBJECT_MAPPER_SNAKE_CASE.setDateFormat(new SimpleDateFormat(STANDARD_FORMAT));//忽略 在json字符串中存在,但是在java对象中不存在对应属性的情况。防止错误OBJECT_MAPPER_SNAKE_CASE.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);//转换为下划线OBJECT_MAPPER_SNAKE_CASE.setPropertyNamingStrategy(PropertyNamingStrategies.SNAKE_CASE);}private JacksonUtil() {}/*** 对象转Json格式字符串** @param obj 对象* @return Json格式字符串*/public static  String obj2String(T obj) {if (obj == null) {return null;}try {return obj instanceof String ? (String) obj : OBJECT_MAPPER.writeValueAsString(obj);} catch (JsonProcessingException e) {log.warn("Parse Object to String error : {}", e.getMessage());return null;}}/*** 对象转file* @param fileName* @param obj*/public static void obj2File(String fileName,Object obj){if (obj == null){return;}try {OBJECT_MAPPER.writeValue(new File(fileName),obj);} catch (IOException e) {e.printStackTrace();}}/*** 对象转Json格式字符串; 属性名从驼峰改为下划线形式** @param obj 对象* @return Json格式字符串*/public static  String obj2StringFieldSnakeCase(T obj) {if (obj == null) {return null;}try {ObjectMapper objectMapper = OBJECT_MAPPER_SNAKE_CASE;return obj instanceof String ? (String) obj : objectMapper.writeValueAsString(obj);} catch (JsonProcessingException e) {log.warn("Parse Object to String error : {}", e.getMessage());return null;}}/*** 字符串转换为自定义对象; 属性名从下划线形式改为驼峰** @param str   要转换的字符串* @param clazz 自定义对象的class对象* @return 自定义对象*/public static  T string2ObjFieldLowerCamelCase(String str, Class clazz) {if (StringUtils.isEmpty(str) || clazz == null) {return null;}try {ObjectMapper objectMapper = OBJECT_MAPPER_SNAKE_CASE;return clazz.equals(String.class) ? (T) str : objectMapper.readValue(str, clazz);} catch (Exception e) {log.warn("Parse String to Object error : {}", e.getMessage());return null;}}/*** 字符串转换为自定义对象(List); 属性名从下划线形式改为驼峰** @param str           要转换的字符串* @param typeReference 自定义对象的typeReference List 对象* @return 自定义对象*/public static  List string2ListFieldLowerCamelCase(String str, TypeReference> typeReference) {if (StringUtils.isEmpty(str) || typeReference == null) {return null;}try {ObjectMapper objectMapper = OBJECT_MAPPER_SNAKE_CASE;return objectMapper.readValue(str, typeReference);} catch (Exception e) {log.warn("Parse String to Object error : {}", e.getMessage());return null;}}/*** 对象转Json格式字符串(格式化的Json字符串)** @param obj 对象* @return 美化的Json格式字符串*/public static  String obj2StringPretty(T obj) {if (obj == null) {return null;}try {return obj instanceof String ? (String) obj : OBJECT_MAPPER.writerWithDefaultPrettyPrinter().writeValueAsString(obj);} catch (JsonProcessingException e) {log.warn("Parse Object to String error : {}", e.getMessage());return null;}}/*** 字符串转换为自定义对象** @param str   要转换的字符串* @param clazz 自定义对象的class对象* @return 自定义对象*/public static  T string2Obj(String str, Class clazz) {if (StringUtils.isEmpty(str) || clazz == null) {return null;}try {return clazz.equals(String.class) ? (T) str : OBJECT_MAPPER.readValue(str, clazz);} catch (Exception e) {log.warn("Parse String to Object error : {}", e.getMessage());return null;}}/*** 字符串转换为自定义字段转为list* @param str* @param typeReference* @param * @return*/public static  T string2Obj(String str, TypeReference typeReference) {if (StringUtils.isEmpty(str) || typeReference == null) {return null;}try {return (T) (typeReference.getType().equals(String.class) ? str : OBJECT_MAPPER.readValue(str, typeReference));} catch (IOException e) {log.warn("Parse String to Object error", e);return null;}}public static  T string2Obj(String str, Class collectionClazz, Class... elementClazzes) {JavaType javaType = OBJECT_MAPPER.getTypeFactory().constructParametricType(collectionClazz, elementClazzes);try {return OBJECT_MAPPER.readValue(str, javaType);} catch (IOException e) {log.warn("Parse String to Object error : {}" + e.getMessage());return null;}}
}

4.实体类

说明: 这里创建一个user实体类

package com.clllb.jackson.PO;import lombok.Data;import java.util.List;@Data
public class User {private String username;private Integer age;private List info;private Long userId;
}

项目样图:
在这里插入图片描述

5.测试类

说明: 测试类中直接调工具类中的方法,非常简单,附输出结果。

a.object类型转Json

说明: 使用writeValueAsString方法

  @Testvoid obj2string(){User user = new User();user.setUsername("clllb");user.setAge(24);user.setUserId(1L);List infoList = new ArrayList<>();infoList.add("有一百万");infoList.add("发大财");user.setInfo(infoList);String json = JacksonUtil.obj2String(user);System.out.println(json);}

输出结果:

{"username":"clllb","age":24,"info":["有一百万","发大财"],"userId":1}

b.object类型转file

说明: 使用writeValue方法

  @Testvoid obj2file(){User user = new User();user.setUsername("clllb");user.setAge(24);user.setUserId(1L);List infoList = new ArrayList<>();infoList.add("有一百万");infoList.add("发大财");user.setInfo(infoList);String fileName = "ccccc";JacksonUtil.obj2File(fileName,user);}

输出结果:
在这里插入图片描述

c.string类型转Object自定义类型

说明: 使用readValue方法

 @Testvoid string2obj(){String json = "{\"username\":\"clllb\",\"age\":24,\"info\":[\"有一百万\",\"发大财\"],\"userId\":11}";User user = JacksonUtil.string2Obj(json, User.class);System.out.println(user);}

输出结果:

User(username=clllb, age=24, info=[有一百万, 发大财], userId=11)

d.string类型转Object自定义类型list

说明: 使用readValue方法,传参变为TypeReference typeReference,这里工具类用的重载方法名是相同的。

@Testvoid string2objList(){String json = "[{\"username\":\"clllb\",\"age\":24,\"info\":[\"有一百万\",\"发大财\"],\"userId\":11},\n" +"{\"username\":\"陈老老老板\",\"age\":25,\"info\":[\"有一千万\",\"发大大财\"],\"userId\":12}]";List user = JacksonUtil.string2Obj(json, new TypeReference>(){});user.forEach(System.out::println);}

输出结果:

User(username=clllb, age=24, info=[有一百万, 发大财], userId=11)
User(username=陈老老老板, age=25, info=[有一千万, 发大大财], userId=12)

e.object类型转String(驼峰转下划线)

说明: 使用writeValueAsString方法,这里区别看工具类就会发现,就是多了一个设置OBJECT_MAPPER_SNAKE_CASE.setPropertyNamingStrategy(PropertyNamingStrategies.SNAKE_CASE);

 @Testvoid obj2sringSnakeCase(){User user = new User();user.setUsername("clllb");user.setAge(24);user.setUserId(11L);List infoList = new ArrayList<>();infoList.add("有一百万");infoList.add("发大财");user.setInfo(infoList);String json = JacksonUtil.obj2StringFieldSnakeCase(user);System.out.println(json);}

输出结果:

{"username":"clllb","age":24,"info":["有一百万","发大财"],"user_id":11}

f.string类型(下划线)转Object类型

说明: 使用readValue方法
```java@Testvoid string2obj(){String json = "{\"username\":\"clllb\",\"age\":24,\"info\":[\"有一百万\",\"发大财\"],\"user_id\":11}";User user = JacksonUtil.string2Obj(json, User.class);System.out.println(user);}

输出结果:

User(username=clllb, age=24, info=[有一百万, 发大财], userId=11)

g.string类型(下划线)转Object自定义类型list

说明: 使用readValue方法,传参变为TypeReference typeReference,这里工具类用的重载方法名是相同的。

 @Testvoid string2objSnakeCase(){String json = "[{\"username\":\"clllb\",\"age\":24,\"info\":[\"有一百万\",\"发大财\"],\"user_id\":11},\n" +"{\"username\":\"陈老老老板\",\"age\":25,\"info\":[\"有一千万\",\"发大大财\"],\"user_id\":12}]";List user = JacksonUtil.string2ListFieldLowerCamelCase(json, new TypeReference>(){});user.forEach(System.out::println);}

输出结果:

User(username=clllb, age=24, info=[有一百万, 发大财], userId=11)
User(username=陈老老老板, age=25, info=[有一千万, 发大大财], userId=12)

总结:工具类非常好用,包含日常所需。Jackson常见用法总结。希望对您有帮助,感谢阅读

结束语:裸体一旦成为艺术,便是最圣洁的。道德一旦沦为虚伪,便是最下流的。
勇敢去做你认为正确的事,不要被世俗的流言蜚语所困扰。

相关内容

热门资讯

“妖王”惠城环保3年15倍,扣... 在5月30日股价创下历史新高后,惠城环保2022年11月以来的累计涨幅超过15倍,系同时间段A股市场...
不慌!港股深 v,a50 期指... 今天早盘港股大跳水,搞得很多股民对节后行情比较担忧。但港股盘中触底反弹,收盘已收回盘中跌幅,a50期...
刚刚,杀出一个医药大白马,挑战... 重重挑战激发无限动力!集采、竞争,仿佛是医药企业头顶的两座大山。连恒瑞医药、华东医药都不免因此出现短...
香港四大家族之一,有麻烦了……... 原创 刘博团队又一家知名大房企,惊爆财务困境。今天,香港四大家族之一——郑裕彤家族控股的、在香港上市...
002875,明日停牌!节前已... 2025.06.02本文字数:279,阅读时长大约1分钟A股“童装第一股”安奈儿正筹划公司控制权变更...
争议升级!两家上市公司深夜互相... 5月中旬以来,玻尿酸、重组胶原蛋白之争引发热议,频频登上网络热搜,且有愈演愈烈之势。6月1日晚间,医...
两宗券商“老鼠仓”曝光:中信证... 地方证监局最新披露的罚单,让两起券商从业人员“老鼠仓”案件浮出水面,2家龙头券商中信证券、华泰证券牵...
土耳其主要银行业指数上涨1.5... 每经AI快讯,6月2日,土耳其主要银行业指数上涨1.5%。
【12366问答】离境退税相关... 12366 热点梳理 问答来啦 退税商店在向境外旅客开具《离境退税申请单》后,如发生境外旅客退货等...
高凌信息:终止发行股份购买资产... 新京报贝壳财经讯 高凌信息6月2日发布公告,公司于2024年12月启动筹划实施重大资产重组,拟通过发...
赛诺菲斥资超90亿美元收购罕见... 当地时间6月2日,法国制药巨头赛诺菲与美国生物药企Blueprint Medicines公司宣布达成...
黔源电力:董事长罗涛因工作原因... 新京报贝壳财经讯 黔源电力6月2日晚间公告,公司董事长罗涛因工作原因申请辞去公司董事长、董事、董事会...
京沪高铁:已完成约10亿元股份... 新京报贝壳财经讯 6月2日,京沪高铁(601816.SH)公告称,公司已使用自有资金约10亿元,以集...
恒宝股份:实控人在股票交易异常... 新京报贝壳财经讯 6月2日,恒宝股份发布异动公告,公司控股股东、实际控制人在股票交易异常波动期间存在...
机构论后市丨关注核心资产;对科... 沪指本周累计跌0.03%,深成指累计跌0.91%,创业板指累计跌1.4%。A股后市怎么走?看看机构怎...
宏信证券更名天府证券,中小券商... 因实控人将发生变化,时隔13年,宏信证券再次更名。国家企业信用信息公示系统信息显示,宏信证券有限责任...
最新!全球9大汽车集团总负债:... 谁是车界负债之王?在企业的经营生产中,负债是难以避免的。企业通过合理的负债水平,是有助于其快速发展的...
韩国紧急商讨应对美上调钢铝关税   新华社首尔6月2日电(记者黄昕欣 陆睿)韩国产业通商资源部2日召集钢铝产业代表召开紧急会议,商讨...
二次育肥“禁令”来了?有猪企回... 二次育肥禁令来了? 今天上午,猪肉板块异动拉升。有市场消息称,“昨天,相关部门开会,透露引导生猪行业...
恒指探底回升跌0.57% 黄金...   中新经纬6月2日电 周一,港股三大指数集体低开,此后探底回升。截至收盘,恒生指数跌0.57%报2...
在下沉市场,找不到中国汽车的未... 原本已经渐入缓和的车市价格战,随着年中6月的到来而再度升温。下到5万元接近老头乐的“车市踢脚线”,上...
全维度突破!雅迪冠能S长续航进... 文 | 无锈钵“你可能不认识我们,但你一定见过我造的车。”5月26日,浙江宁波,雅迪全球产品及技术副...
晶科能源:收到政府补助9800... 晶科能源(688223)公告,5月29日收到政府补助人民币9800万元,属于与收益相关的政府补助款项...
国际金价年内上涨超25%,5月... 首先来看美股上周交易的情况。受美欧贸易谈判出现积极信号、美国国际贸易法院一度“叫停”特朗普政府多项关...
全球人造草坪老二青岛青禾“躺平... 5月26日-6月2日,沪深北合计有3家企业终止审核,分别为沪市主板申报企业青岛青禾人造草坪股份有限公...
MiniMax正暗戳戳憋大招 ... 出品|虎嗅科技组作者|宋思杭编辑|苗正卿头图|视觉中国AI六小虎之一的MiniMax正在憋大招,而这...
今日起招股发售价9.75港元,... 6月2日,车来了母公司元光科技启动全球发售,发售价9.75港元,预计将在6月10日在港交所挂牌。元光...
港股午评:恒生指数跌2.20%... 新京报贝壳财经讯 6月2日,港股午间收盘,恒生指数跌2.20%,恒生科技指数跌2.43%。石药集团跌...
夏乐:美债压力与美元走弱 全球... 原创 财联社 蜂网专家2025年05月29日《首席说》是财联社倾力打造的一档高端直播联线栏目。面向泛...
罗志恒:财政政策不应受3%赤字... 罗志恒系粤开证券首席经济学家、中国首席经济学家论坛理事自2008年以来,本轮积极财政政策实行了长达1...