springboot自定义jackson序列化,默认null值个性化处理返回值

2023-11-13

转载:https://www.cnblogs.com/guoxiaoyu/p/13667961.html

  最近在项目中遇到,返回对象和属性为null时,接口不返回这个字段,但在实际中即使这个字段为null也是需要返回的,也试了好多,加json注解什么的,都没效果,最后通过下面的方式实现了,特此记录一下

第一步:写配置类

@Configuration
public class WebConfiguration  extends WebMvcConfigurationSupport {
@Override
    protected void extendMessageConverters(List<HttpMessageConverter<?>> converters) {
        converters.stream().filter(c -> c instanceof MappingJackson2HttpMessageConverter)
                .map(c ->(MappingJackson2HttpMessageConverter)c)
                .forEach(c->{
                    ObjectMapper mapper = c.getObjectMapper();
                    // 为mapper注册一个带有SerializerModifier的Factory,此modifier主要做的事情为:当序列化类型为array,list、set时,当值为空时,序列化成[]
                    mapper.setSerializerFactory(mapper.getSerializerFactory().withSerializerModifier(new MyBeanSerializerModifier()));
                    c.setObjectMapper(mapper);
                });
    }
}

第二步:编写值为null时的自定义序列化

/**
 * @title: MyBeanSerializerModifier
 * @Author junyu
 * 旧巷里有一个穿着白衬衫笑起来如太阳般温暖我的少年。
 * 记忆里有一个穿着连衣裙哭起来如孩子般讨人喜的女孩。
 * 他说,哪年树弯了腰,人见了老,桃花落了白发梢,他讲的笑话她还会笑,那便是好。
 * 她说,哪年国改了号,坟长了草,地府过了奈何桥,她回头看时他还在瞧,就不算糟。
 * @Date: 2020/9/12 16:44
 * @Version 1.0
 */
public class MyBeanSerializerModifier extends BeanSerializerModifier {

    private MyNullStringJsonSerializer myNullStringJsonSerializer;
    private MyNullArrayJsonSerializer MyNullArrayJsonSerializer;
    private MyNullObjectJsonSerializer MyNullObjectJsonSerializer;
    private MyNullJsonSerializer myNullJsonSerializer;

    public MyBeanSerializerModifier(){
        myNullStringJsonSerializer = new MyNullStringJsonSerializer();
        MyNullArrayJsonSerializer = new MyNullArrayJsonSerializer();
        MyNullObjectJsonSerializer =  new MyNullObjectJsonSerializer();
        myNullJsonSerializer = new MyNullJsonSerializer();
    }

    @Override
    public List<BeanPropertyWriter> changeProperties(SerializationConfig config, BeanDescription beanDesc,
                                                     List<BeanPropertyWriter> beanProperties) {
        // 循环所有的beanPropertyWriter
        beanProperties.forEach(writer ->{
            // 判断字段的类型
            if (isArrayType(writer)) {
                //给writer注册一个自己的nullSerializer
                writer.assignNullSerializer(MyNullArrayJsonSerializer);
            } else if (isObjectType(writer)) {
                writer.assignNullSerializer(MyNullObjectJsonSerializer);
            } else if (isStringType(writer)) {
                writer.assignNullSerializer(myNullStringJsonSerializer);
            } else if (isPrimitiveType(writer)) {
                writer.assignNullSerializer(myNullJsonSerializer);
            }
        });
        return beanProperties;
    }

    // 判断是否是boolean类型
    private boolean isPrimitiveType(BeanPropertyWriter writer) {
        Class<?> clazz = writer.getType().getRawClass();
        return clazz.isPrimitive();
    }

    // 判断是否是string类型
    private boolean isStringType(BeanPropertyWriter writer) {
        Class<?> clazz = writer.getType().getRawClass();
        return clazz.equals(String.class);
    }

    // 判断是否是对象类型
    private boolean isObjectType(BeanPropertyWriter writer) {
        Class<?> clazz = writer.getType().getRawClass();
        return !clazz.isPrimitive() && !clazz.equals(String.class)
                && clazz.isAssignableFrom(Object.class);
    }
    // 判断是否是集合类型
    protected boolean isArrayType(BeanPropertyWriter writer) {
        Class<?> clazz = writer.getType().getRawClass();
        return clazz.isArray() || clazz.equals(List.class) || clazz.equals(Set.class);
    }

    class MyNullJsonSerializer extends JsonSerializer<Object>{

        @Override
        public void serialize(Object value, JsonGenerator jgen, SerializerProvider serializers) throws IOException {
            if (value == null) {
                jgen.writeNull();
            }
        }
    }


    class MyNullStringJsonSerializer extends JsonSerializer<Object>{

        @Override
        public void serialize(Object value, JsonGenerator jgen, SerializerProvider serializers) throws IOException {
            if (value == null) {
                jgen.writeString(StringUtils.EMPTY);
            }
        }
    }

    class MyNullArrayJsonSerializer extends JsonSerializer<Object>{

        @Override
        public void serialize(Object value, JsonGenerator jgen, SerializerProvider serializers) throws IOException {
            if (value == null) {
                jgen.writeStartArray();
                jgen.writeEndArray();
            }
        }
    }

    class MyNullObjectJsonSerializer extends JsonSerializer<Object>{

        @Override
        public void serialize(Object value, JsonGenerator jgen, SerializerProvider serializers) throws IOException {
            if (value == null) {
                jgen.writeStartObject();
                jgen.writeEndObject();
            }
        }
    }

}

  这样基本配置就完事了,现在可以试试效果了,自己定义一个bean用来返回,定义一个简单的controller去接受访问就行了,博主就不进行写这两个类了。返回结果如下

   这是我的项目需求需要实现的,大家可以根据的自己的需求去改写MyBeanSerializerModifier这个类。还有另一种实现方式:不继承

@Configuration
public class WebConfiguration {

@Bean
    public MappingJackson2HttpMessageConverter mappingJackson2HttpMessageConverter(){
        MappingJackson2HttpMessageConverter mappingJackson2HttpMessageConverter = new MappingJackson2HttpMessageConverter();
        ObjectMapper mapper = mappingJackson2HttpMessageConverter.getObjectMapper();
        mapper.setSerializerFactory(mapper.getSerializerFactory().withSerializerModifier(new MyBeanSerializerModifier()));
        mappingJackson2HttpMessageConverter.setObjectMapper(mapper);
        return mappingJackson2HttpMessageConverter;
    }

}

这种方法也是可以设置成功的,主要是不是继承了WebMvcConfigurationSupport类,毕竟这个类有很多可以自定义的方法,用起来顺手而已。

  

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

springboot自定义jackson序列化,默认null值个性化处理返回值 的相关文章

随机推荐

  • 可编程手机蓝牙App控制直流电机速度

    我们将通过 Android 应用程序 app 介绍直流电机速度控制 对于该项目 该应用程序安装在智能手机设备中 该设备使用蓝牙向控制直流电机速度的电路发送命令 此 Android 应用程序具有引人注目且易于使用的图形用户界面 GUI 我们将
  • IBM区块链负责人Jesse Lund的“你问我答”

    点击上方 蓝色字 可关注我们 编辑 铅笔盒 IBM区块链部门负责人Jesse Lund抽空参与了 你问我答 活动 Ask Me Anything AMA 回答了关于加密货币及IBM与Stellar合作关系的一些问题 具体内容如下 IBM现在
  • ue4 DerivedDataCache报错

    启动ue4时报错 报错堆栈如下 从堆栈可以看出是DerivedDataCache报错 从堆栈的CachedDataProbablyExists函数更可以看出是在判断cache是否存在 故而想到删除项目目录下DerivedDataCache中
  • RPC框架的异步处理

    RPC异步调用 以tars rpc框架为示例说明 引入工作线程池和io收发线程池将工作线程和io收发线程两者的同步关系解除 RPC中的上下文十分重要 因为请求包的发送 响应包的callback回调不在同一个工作线程中完成 需要一个conte
  • 计算机组长原理,期末项目考核-计算机组成原理-组长学号-组长姓名

    2012 2013 第一学期第一学期 计算机组成原理计算机组成原理 期末考核期末考核 职位姓名学号在项目中担任的工作成绩 组长 组员 组员 组员 一 项目一 项目 1 描述 描述 设 CPU 共有 16 根地址线 8 根数据线 R W 作读
  • 山洪灾害预警方案(山洪预警解决方案的组成)

    随着气候变化的不断加剧 山洪灾害在许多地区成为了极具威胁性的自然灾害之一 为了帮助地方政府和居民更好地预防和应对山洪灾害 我们设计了一套基于星创易联的SR600工业路由器和DTU200的山洪灾害预警方案 并成功在某地区进行了部署 案例背景
  • Transaction rolled back because it has been marked as rollback-only 解决办法

    今天早上高高兴兴上班 居然收到一大堆报警信息 仔细看了一下具体内容 都在提示这个错误 Transaction rolled back because it has been marked as rollback only 我一看就觉得奇怪了
  • Linux I/O编程 实验内容

    一 实验目的 练习用UNIX I O进行文件读写的编程方法 用UNIX I O函数管理文本信息 二进制数据 结构体数据 掌握UNIX I O的基本编程方法 练习测时函数使用 通过测量UNIX I O函数运行时间 建立UNIX I O API
  • 数据结构 ——二叉树 前序、中序、后序、层次遍历及非递归实现 查找、统计个数、比较、求深度的递归实现

    一 基本概念 每个结点最多有两棵子树 左子树和右子树 次序不可以颠倒 性质 1 非空二叉树的第n层上至多有2 n 1 个元素 2 深度为h的二叉树至多有2 h 1个结点 满二叉树 所有终端都在同一层次 且非终端结点的度数为2 在满二叉树中若
  • 牛客网 HJ96 表示数字

    牛客网 HJ96 表示数字 将一个字符中所有的整数前后加上符号 其他字符保持不变 连续的数字视为一个整数 import re def deal with match value match group value return value
  • Pix2PixHD 阅读笔记(翻译)

    High Resolution Image Synthesis and Semantic Manipulation with Conditional GANs 作者 Ting Chun Wang NVIDIA Ming Y u Liu NV
  • C++扫雷小游戏

    核心算法 就是关于点击雷区的操作 data数组用来储存雷区 雷9 非雷非数字 0 数字 1 8 clickdata数组用来储存雷区是否被按过 没按过 0 左键按过 1 右键按过 2 int click int i int j int k 点
  • LeetCode200—岛屿数量(java版)

    题目描述 标签 深度优先搜索 广度优先搜索 并查集 数组 矩阵 给你一个由 1 陆地 和 0 水 组成的的二维网格 请你计算网格中岛屿的数量 岛屿总是被水包围 并且每座岛屿只能由水平方向和 或竖直方向上相邻的陆地连接形成 此外 你可以假设该
  • drools 7.x 决策表转drl

    1 决策表内容 位置 Users lcc IdeaProjects drools test src main resources com drools excel table test1 personAge xlsx 内容 RuleSet
  • html5多个图片位置_React 实现简易的图片拖动排序

    基本介绍 在 web 页面中 如果需要改变多个元素的位置 可以通过元素拖动来实现 HTML5中加入了一个全局属性draggable 通过设置该属性的值为 true false 来控制元素是否可拖动 需要注意的是 链接和图片默认是可拖动的 可
  • Linux之vi编辑器的使用方法和常用命令

    Linux之vi编辑器 前言 对于初级程序开发工程师而言 Linux是很多人要接触的内容 为此我给大家来做一下总结 希望能够帮到你们 课程说明 1 介绍vi编辑器的使用方法 2 介绍vi编辑器的常用命令 vi编辑器 vi的基本概念 基本上v
  • 高德地图开发-常用api踩坑使用

    一 高德地图的加载初始化 在这就踩过很多坑 新建项目正常显示没问题 放到我们的项目就是不显示 加载不出来 这个时候不要慌 只要确保下面三部完成就莫问题了 1 引入高德地图开发者api 生成key的方式自行百度 一大堆 下面是我的 我开发的时
  • 同步代码块 synchronized

    一 线程的同步 原因 Java允许多线程并发执行 当多个线程同时操作一个可共享资源时 将会导致相互之间产生冲突 因此加入同步锁来避免该线程没有完成操作之前 被其他线程的调用 从而保证该资源的唯一性和准确性 三种实现同步方式 同步代码块 同步
  • python-pcl可视化

    读取pcd文件 path test pcd pcd cloud pcl load path print cloud size print 共计 str cloud width cloud height 个点 for i in range 0
  • springboot自定义jackson序列化,默认null值个性化处理返回值

    转载 https www cnblogs com guoxiaoyu p 13667961 html 最近在项目中遇到 返回对象和属性为null时 接口不返回这个字段 但在实际中即使这个字段为null也是需要返回的 也试了好多 加json注