欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

springboot jackson配置教程

程序员文章站 2022-06-17 23:02:07
目录springboot配置jackson处理字段javabean序列化为jsonspringboot jackson配置项目中使用的json是jackson。这个呢是spring boot自带的,一...

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测试一下

springboot jackson配置教程

可以看见 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;

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