jackson 控制处理

复制代码
jackson:
  default-property-inclusion: always   # 确保 null 会走到序列化器
  serialization:
    write-null-map-values: true
java 复制代码
package com.idsoftwhl.biz.init;

import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.databind.*;
import com.fasterxml.jackson.databind.ser.BeanPropertyWriter;
import com.fasterxml.jackson.databind.ser.BeanSerializerModifier;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import java.io.IOException;
import java.util.List;

@Configuration
public class JacksonConfig {
    public JacksonConfig() {
        System.out.println(">>>>>>>>>> JacksonPatch loaded <<<<<<<<<<");
    }

    @Bean
    public ObjectMapper objectMapper() {
        ObjectMapper om = new ObjectMapper();
        om.setSerializationInclusion(JsonInclude.Include.ALWAYS);   // 让 null 也参与序列化

        // 1. 非集合 -> ""
        JsonSerializer<Object> nullToEmptyString = new JsonSerializer<Object>() {
            @Override
            public void serialize(Object value, JsonGenerator g,
                                  SerializerProvider provider) throws IOException {
                g.writeString("");
            }
        };

        // 2. 集合 -> []
        JsonSerializer<Object> nullToEmptyArray = new JsonSerializer<Object>() {
            @Override
            public void serialize(Object value, JsonGenerator g,
                                  SerializerProvider provider) throws IOException {
                g.writeStartArray();
                g.writeEndArray();
            }
        };

        // 3. 注册 Modifier
        om.setSerializerFactory(
                om.getSerializerFactory()
                        .withSerializerModifier(new BeanSerializerModifier() {
                            @Override
                            public List<BeanPropertyWriter> changeProperties(SerializationConfig config,
                                                                             BeanDescription beanDesc,
                                                                             List<BeanPropertyWriter> writers) {
                                for (BeanPropertyWriter w : writers) {
                                    if (w.getType().isCollectionLikeType() || w.getType().isArrayType()) {
                                        w.assignNullSerializer(nullToEmptyArray);
                                    } else {
                                        w.assignNullSerializer(nullToEmptyString);
                                    }
                                }
                                return writers;
                            }
                        })
        );
        return om;
    }
}
相关推荐
泓铮3 小时前
Windows 环境下 WSL2 与 VMware Workstation 17 共存机制研究与工程实践
windows
明湖起风了6 小时前
mqtt消费堆积
java·jvm·windows
私人珍藏库7 小时前
[Windows] 【灵犀Claw生成】酷狗加密音乐批量转换工具 Xy Music Converter
windows·工具·软件·多功能
handsomestWei9 小时前
claude-code在win环境安装使用
windows·ai编程·claude·安装配置·cc-switch
秦时明月之君临天下9 小时前
Windows如何删除任务管理器中的某个服务?
windows
麦田里的守望者_zhg10 小时前
Windows 执行 wsl --update 报错 1603:注册表权限导致 WSL 安装损坏问题排查与修复
windows
❆VE❆11 小时前
Claude Code 安装与配置完整指南(Windows)
windows·claude code
航Hang*12 小时前
VMware vSphere 云平台运维与管理基础——第5章:VMware vSphere 5.5 高级特性
运维·服务器·开发语言·windows·学习·虚拟化
Mapleay12 小时前
Ubuntu 源的重要性!之 libgmp-dev 无法安装
linux·服务器·windows
humors22112 小时前
微软工具包下载网址
windows·microsoft·微软·office·工具包·sysintervals