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;
    }
}
相关推荐
ZnS_oscar4 分钟前
不用下载字体,获得仿宋字体
windows·word
霸道流氓气质26 分钟前
通义千问 Chat 模型高级用法:Function Calling / Structured Output / 多轮对话
linux·运维·windows
Boop_wu1 小时前
[LangGraph] 案例 2 : 支持搜索的智能代理系统
服务器·windows·python·langchain
啦啦啦~~~2221 小时前
PC端+安卓端阅读器推荐!开源本地小说阅读器软件,
android·论文阅读·windows·开源软件·福昕阅读器
C++ 老炮儿的技术栈3 小时前
Qt5 使用 QPainter 绘制阿基米德螺线
开发语言·c++·windows·qt·代码化
今日热点4 小时前
Windows 系统 C 盘深度清理教程:安全释放存储空间,避开误删风险
windows·安全
gsls2008084 小时前
告别 Vault 的复杂度:用 Go 标准库给 Windows 凭据管理器装上 MCP
windows·golang·mcp
Mrs_DongDong4 小时前
华为云 Windows 服务器远程桌面自定义端口排障指南
服务器·windows·华为云
Sagittarius_A*4 小时前
CVE-2026-42271:从 MCP stdio 测试接口看 LiteLLM 的命令执行风险与防御闭环
网络·windows·安全·cve·rce
水饺编程5 小时前
第5章,[Win32 章节] :圆角矩形教学插图绘制程序
c语言·c++·windows·visual studio