springboot jackson配置教程

 更新时间:2021年10月11日 14:47:31   作者:知我饭否  
这篇文章主要介绍了springboot jackson配置教程,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

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;

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • java日期操作工具类(获取指定日期、日期转换、相隔天数)

    java日期操作工具类(获取指定日期、日期转换、相隔天数)

    这篇文章主要为大家详细介绍了java日期操作工具类,包括获取指定日期、日期转换、相隔天数等操作,感兴趣的小伙伴们可以参考一下
    2016-06-06
  • 详解Java数组的定义和声明方法

    详解Java数组的定义和声明方法

    在Java开发中,数组是最常用的数据结构之一,因此,深入了解Java数组的定义和声明是非常必要的,本文将详细介绍Java数组的定义和声明方法,以及其在实际开发中的应用场景、优缺点等方面,需要的朋友可以参考下
    2023-11-11
  • MyBatis环境资源配置实现代码详解

    MyBatis环境资源配置实现代码详解

    这篇文章主要介绍了MyBatis环境资源配置实现代码解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-08-08
  • java把excel内容上传到mysql实例代码

    java把excel内容上传到mysql实例代码

    这篇文章主要介绍了java把excel内容上传到mysql实例代码,具有一定借鉴价值,需要的朋友可以参考下
    2018-01-01
  • 详解rabbitmq使用springboot实现fanout模式

    详解rabbitmq使用springboot实现fanout模式

    这篇文章主要介绍了rabbitmq使用springboot实现fanout模式,Fanout特点是发布与订阅模式,是一种广播机制,它是没有路由key的模式,需要的朋友可以参考下
    2023-07-07
  • springboot如何使用vue打包过的页面资源

    springboot如何使用vue打包过的页面资源

    这篇文章主要介绍了springboot如何使用vue打包过的页面资源,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-12-12
  • 详解Java如何在CompletableFuture中实现日志记录

    详解Java如何在CompletableFuture中实现日志记录

    这篇文章主要为大家详细介绍了一种slf4j自带的MDC类,来记录完整的请求日志,和在CompletableFuture异步线程中如何保留链路id,需要的可以参考一下
    2023-04-04
  • Spring Security基于过滤器实现图形验证码功能

    Spring Security基于过滤器实现图形验证码功能

    验证码就是为了防止恶意用户采用暴力重试的攻击手段而设置的一种防护措施,接下来在Spring Security的环境中,我们可以用两种方案实现图形验证码,具体实现方法跟随小编一起看看吧
    2021-09-09
  • Java使用Callable接口实现多线程的实例代码

    Java使用Callable接口实现多线程的实例代码

    这篇文章主要介绍了Java使用Callable接口实现多线程的实例代码,实现Callable和实现Runnable类似,但是功能更强大,具体表现在可以在任务结束后提供一个返回值,Runnable不行,call方法可以抛出异,Runnable的run方法不行,需要的朋友可以参考下
    2023-08-08
  • 详解微信开发之Author网页授权

    详解微信开发之Author网页授权

    微信开发中,经常有这样的需求:获得用户头像、绑定微信号给用户发信息,那么实现这些的前提就是授权!本文对此进行系统介绍,需要的朋友一起来看下吧
    2016-12-12

最新评论