springboot jackson配置教程
作者:知我饭否 发布时间:2021-12-10 20:47:16
springboot jackson配置
项目中使用的json是jackson。这个呢是spring boot自带的,一开始是用阿里的fastjson的。但是 总是有漏洞。还是用jackson,谷歌的gson也感觉非常棒。
需求
在controller 使用@RestController 返回json。使用的是 jackson。在处理BigDecimal的时候,想去掉 小数点后面的 00,例如 280.00.
全局配置
这种需求 肯定是全局配置一下了。看了一下文档,配置一下,感觉还可以 写一下吧。
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.core.json.JsonReadFeature;
import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.JsonSerializer;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializerProvider;
import com.fasterxml.jackson.databind.json.JsonMapper;
import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateTimeSerializer;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import java.io.IOException;
import java.math.BigDecimal;
import java.text.DecimalFormat;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
/**
* @Author: plani
* 创建时间: 2020/9/22 9:41
*/
@Configuration
public class JacksonConfig {
@Bean
@Primary
@ConditionalOnMissingBean(ObjectMapper.class)
public ObjectMapper jacksonObjectMapper()
{
JsonMapper.Builder builder = JsonMapper.builder();
// 通过该方法对mapper对象进行设置,所有序列化的对象都将按改规则进行系列化
// Include.Include.ALWAYS 默认
// Include.NON_DEFAULT 属性为默认值不序列化
// Include.NON_EMPTY 属性为 空("") 或者为 NULL 都不序列化,则返回的json是没有这个字段的。这样对移动端会更省流量
// Include.NON_NULL 属性为NULL 不序列化
builder.serializationInclusion(JsonInclude.Include.NON_EMPTY);
//有未知属性 要不要抛异常
builder.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
//是否允许JSON字符串包含未转义的控制字符(值小于32的ASCII字符,包括制表符和换行符)的特性。如果feature设置为false,则在遇到这样的字符时抛出异常。
builder.configure(JsonReadFeature.ALLOW_UNESCAPED_CONTROL_CHARS, true);
//确定解析器是否允许使用单引号(撇号,字符'\ ")引用字符串(名称和字符串值)的特性。如果是,这是除了其他可接受的标记。但不是JSON规范)。
builder.configure(JsonParser.Feature.ALLOW_SINGLE_QUOTES, true);
JsonMapper jsonMapper = builder.build();
JavaTimeModule javaTimeModule = new JavaTimeModule();
//添加 序列器 这里是对 BigDecimal 类型处理,这是关键代码
javaTimeModule.addSerializer(BigDecimal.class, new JsonSerializer<BigDecimal>() {
@Override
public void serialize(BigDecimal value, JsonGenerator gen, SerializerProvider serializers) throws IOException {
DecimalFormat fnum = new DecimalFormat("#.##");
//把 这个BigDecimal 属性对应的值,写成 String 类型
gen.writeString(fnum.format(value));
}
});
//处理 时间格式
javaTimeModule.addSerializer(LocalDateTime.class, new LocalDateTimeSerializer(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
//注册
jsonMapper.registerModule(javaTimeModule);
return jsonMapper;
}
}
上面最重要的 就是 addSerializer 这个方法,用来处理对应类型的 转化。注释的很清楚,看不懂的可以留言问我。
额外
网上有好多上面是ObjectMapper 这个进行设置,这个呢里面有不少是 标记过时的。 所以 我用了JsonMapper
测试
写一个 controller 方法,返回含有BigDecimal的类,来测试一下
@PostMapping("test")
public Map test() {
Map<String, Object> map = new HashMap<>();
BigDecimal bigDecimal = new BigDecimal("280.00");
map.put("one", bigDecimal);
return map;
}
用postman测试一下
可以看见 280.00 被转成了 280。 好了,研究我的深度学习去了
springboot配置jackSon处理字段
常用框架:阿里,fastjson,谷歌,gson等。
javaBean序列化为json
① 性能:Jackson > Fastjson > Gson > Json-lib同个结构
② Jackson、Fastjson、Gson 类库各有特点,各有自己的专长
③ 空间换时间,时间换空间
jackson处理相关自动
① 指定字段不返回:@jsonIgnore(主要用于密码,让密码不显示,加在字段上面)
② 指定日期格式:@JsonFormat(pattern = “yyyy-MM-dd hh:mm:ss”,locale = “zh”,timezone = “GMT+8”)
③ 空字段不返回:@JsonInclude(JsonInclude.Include.NON_NULL)
③ 指定别名:@JsonProperty(“create_time”)
开发功能:视频创建时候返回自定义格式,过滤用户敏感信息。
private int price;
@JsonProperty("cover_img")
private String coverImg;
@JsonFormat(pattern = "yyyy-MM-dd hh:mm:ss",locale = "zh",timezone = "GMT+8")
@JsonProperty("create_time")
private Date createTime;
@JsonInclude(JsonInclude.Include.NON_NULL)
private List<Chapter> chapterList;
来源:https://blog.csdn.net/a1064072510/article/details/108726631


猜你喜欢
- 从接触springboot开始,便深深的被它的简洁性深深的折服了,精简的配置,方便的集成,使我再也不想用传统的ssm框架来搭建项目,一大堆的
- 本文实例为大家分享了Flutter实现底部导航栏的具体代码,供大家参考,具体内容如下效果实现先将自动生成的main.dart里面的代码删除,
- 本文实例为大家分享了Java实现猜数字游戏的具体代码,供大家参考,具体内容如下完成猜数字游戏需要实现以下几点:获得一个随机数作为“答案数”;
- 自定义控件的步骤:1 View的工作原理2 编写View类3 为View类增加属性4 绘制屏幕5 响应用户消息6 自定义回调函数java代码
- 在实际的开发中,很多时候还会遇到相对比较复杂的需求,比如产品妹纸或UI妹纸在哪看了个让人兴奋的效果,兴致高昂的来找你,看了之后目的很明确,当
- 一、项目整体介绍:项目整体的结构如下图所示,项目整体采用 springboot + mybatis + jsp + mysql 来完成的,下
- 缘起随着 App 的成长,我们难免会遇到以下这些需求:H5 跳原生界面Notification 点击调相关界面根据后台返回数据跳转界面,例如
- 1. 控件说明SwipeRefreshLayout是google官方推荐使用的下拉刷新的控件,如果用户想通过垂直滑动手势刷新视图的内容,就可
- 1.Object类是什么?🟪Object 是 Java 类库中的一个特殊类,也是所有类的父类。也就是说,Java 允许把任何类型的
- 接口:Writerablepackage com.geoway.pad.common; import java.io.DataInput;
- 动态方法就是一个Action对应多个请求,减少Action的数量1、指定method属性<action name="addA
- 目录截屏AudioRecord音频采集MediaCodec编码音频数据Rtp发送数据SDP文件配置音频config配置计算方式:vlc测试播
- 一、代理是Java常用的设计模式,代理类通过调用被代理类的相关方法,并对相关方法进行增强。加入一些非业务性代码,比如事务、日志、报警发邮件等
- 在Android开发中我们经常使用MediaPlayer来播放音频文件,但是MediaPlayer存在一些不足,例如:资源占用量较高、延迟时
- 这个工具比较简单,用于配合另外一个工具进行文件传送,废话少说,上代码import java.net.URL;import java.net.
- IDEA安装后找不到.vmoptions文件在安装IDEA后在C盘的C:\Users\你的电脑用户名.IntelliJIdea2019.1\
- java读取resources文件详解及实现代码Java项目中,经常需要将资源文件打包放在项目中,然后在项目中去读取对应的文件。实现代码:S
- 1.与过滤器filter的区别2.springMVC中 * 的必须实现的三个方法:3. * 类的编写:package com.imooc.
- C#中Directory.GetFiles() 函数的使用C#中Directory.GetFiles(string path , strin
- 本文实例为大家分享了Android自定义View实现公交成轨迹图的具体代码,供大家参考,具体内容如下总体分析下:水平方向recyclewvi