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

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;

来源:https://blog.csdn.net/a1064072510/article/details/108726631

标签:springboot,jackson,配置
0
投稿

猜你喜欢

  • C# List集合中获取重复值及集合运算详解

    2022-06-13 17:15:45
  • Android自定义单选多选下拉列表的实例代码

    2022-06-08 15:53:33
  • SpringBoot使用JWT实现登录验证的方法示例

    2023-09-19 19:12:10
  • JAVA泛型的继承和实现、擦除原理解析

    2023-03-12 19:37:09
  • java 工厂模式的讲解及优缺点的介绍

    2022-02-05 10:57:09
  • C#获取图片文件扩展名的方法

    2022-03-06 04:27:43
  • 使用Java操作TensorFlow的方法

    2023-11-27 21:31:38
  • java Map接口子类HashMap遍历与LinkedHashMap详解

    2021-11-18 04:43:38
  • C#实现HTTP上传文件的方法

    2023-04-28 04:05:30
  • 分享Java常用几种加密算法(四种)

    2022-05-14 17:59:19
  • 详解java IO流之缓冲流的使用

    2023-08-08 18:33:16
  • 解决Springboot启动报错:类文件具有错误的版本61.0,应为 52.0

    2023-03-13 02:16:11
  • Spring boot + mybatis + Vue.js + ElementUI 实现数据的增删改查实例代码(二)

    2022-11-14 18:37:22
  • java中分组统计的三种实现方式

    2023-05-29 06:04:13
  • Java concurrency集合之 CopyOnWriteArrayList_动力节点Java学院整理

    2022-10-27 05:03:36
  • Java使用EasyExcel动态添加自增序号列

    2023-11-17 01:54:37
  • Java Gradle项目中的资源正确获取方式

    2022-10-05 09:00:50
  • Android可配置透明度的水印

    2021-06-06 14:07:42
  • 详解Spring中bean的几种注入方式

    2023-02-12 20:25:07
  • java使用归并删除法删除二叉树中节点的方法

    2022-03-31 23:06:12
  • asp之家 软件编程 m.aspxhome.com