首页 > 其他分享 >Springboot枚举自定义序列化

Springboot枚举自定义序列化

时间:2024-09-11 14:05:18浏览次数:8  
标签:jackson Springboot 自定义 jsonGenerator field import 序列化 com name

package xxxxxxxxxxxxx;

import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.databind.JsonSerializer;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializerProvider;
import com.fasterxml.jackson.databind.module.SimpleModule;
import lombok.extern.slf4j.Slf4j;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import java.io.IOException;
import java.lang.reflect.Field;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

@Slf4j
@Configuration
public class JacksonConfig {

    @Bean
    public ObjectMapper objectMapper() {
        ObjectMapper mapper = new ObjectMapper();
        SimpleModule module = new SimpleModule();
        module.addSerializer(Enum.class, new GenericEnumSerializer());
        mapper.registerModule(module);
        return mapper;
    }
    public static class GenericEnumSerializer extends JsonSerializer<Enum> {
        private static final Map<Class<? extends Enum<?>>, Field> enumFieldCache = new ConcurrentHashMap<>();
        @Override
        public void serialize(Enum anEnum, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException {
            jsonGenerator.writeStartObject();
            Class<?> enumClass = anEnum.getClass();
            try {
                jsonGenerator.writeStringField("key", anEnum.name());
                Field nameField = enumFieldCache.computeIfAbsent((Class<? extends Enum<?>>) enumClass, cls -> {
                    try {
                        Field field = cls.getDeclaredField("name");
                        field.setAccessible(true);
                        return field;
                    } catch (NoSuchFieldException e) {
                        log.warn("no 'name' field in enum class: {}", cls.getName());
                        return null;
                    }
                });
                if (nameField != null) {
                    String val = nameField.get(anEnum).toString();
                    jsonGenerator.writeStringField("value", val);
                }
            } catch (IllegalAccessException e) {
                log.warn("Cannot access 'name' field in enum class: {}", enumClass.getName());
            }
            jsonGenerator.writeEndObject();
        }
    }
}

 

 

{
  "name": "test",
  "test": {
    "key": "dev",
    "value": "开发"
  },
  "a": {
    "key": "A",
    "value": "A1"
  },
  "b": {
    "key": "X",
    "value": "X1"
  }
}

 

标签:jackson,Springboot,自定义,jsonGenerator,field,import,序列化,com,name
From: https://www.cnblogs.com/namedlxd/p/18408133

相关文章

  • 【JAVA开源】基于Vue和SpringBoot员工绩效考核系统
    本文项目编号T021,文末自助获取源码\color{red}{T021,文末自助获取源码}......
  • 【JAVA开源】基于Vue和SpringBoot大学生入学审核系统
    本文项目编号T022,文末自助获取源码\color{red}{T022,文末自助获取源码}......
  • 【JAVA开源】基于Vue和SpringBoot房屋租赁系统
    本文项目编号T020,文末自助获取源码\color{red}{T020,文末自助获取源码}......
  • 摄影分享|基于Springboot的摄影分享网站设计与实现(源码+数据库+文档)
    摄影分享源码|基于SpingBoot+vue的摄影分享网站|摄影分享网站源码影分享网站源码:摄影分享网站能够高效管理,使信息管理方法更为科学和规范化,摄影分享网站应用Java语言表达开展代码编写,摄影分享网站规范化管理信息具备安全性强、工作效率高、内存空间大、成本费用低等特点。它能......
  • 基于Springboot的养老院管理系统设计与实现毕业设计-附源码
    养老院|养老院管理系统源码|养老院管理系统设计与实现|基于Springboot的养老院管理系统养老院管理系统源码:计算机上安装养老院管理系统软件来发挥其高效地信息处理的作用,养老院管理系统的有效运用可以帮助管理人员准确快速地处理信息,养老院管理系统在对开发工具的选择上也很慎......
  • [毕设作品]SpringBoot疫苗在线预约系统
    文章目录前言技术栈功能介绍实现页面截图文章参考我的优势我的个人网站代码参考数据库参考源码获取前言❤️博主简介:全网累计客户1000+,培训机构讲师、全栈开发工程师、知乎/小红书优秀作者、腾讯云/阿里云VIP客户、专注Java、小程序、安卓领域和毕业项目开发❤️⭐️文......
  • 基于SpringBoot的医院管理系统+LW示例参考
    系列文章目录1.基于SSM的洗衣房管理系统+原生微信小程序+LW参考示例2.基于SpringBoot的宠物摄影网站管理系统+LW参考示例3.基于SpringBoot+Vue的企业人事管理系统+LW参考示例4.基于SSM的高校实验室管理系统+LW参考示例5.基于SpringBoot的二手数码回收系统+原生微信小......
  • 基于SpringBoot的校园跑腿系统+LW参考示例
    系列文章目录1.基于SSM的洗衣房管理系统+原生微信小程序+LW参考示例2.基于SpringBoot的宠物摄影网站管理系统+LW参考示例3.基于SpringBoot+Vue的企业人事管理系统+LW参考示例4.基于SSM的高校实验室管理系统+LW参考示例5.基于SpringBoot的二手数码回收系统+原生微信小......
  • SpringBoot+Neo4j+Vue+Es集成ES全文检索、Neo4J知识图谱、Activiti工作流的知识库管理
    在数字化高度普及的时代,企事业机关单位在日常工作中会产生大量的文档,例如医院制度汇编,企业知识共享库等。针对这些文档性的东西,手工纸质化去管理是非常消耗工作量的,并且纸质化查阅难,易损耗,所以电子化管理显得尤为重要。【springboot+elasticsearch+neo4j+vue+activiti】实现数......
  • Springboot计算机毕业设计校园失物招领系统(程序+源码+数据库+调试部署+开发环境)
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表权利人,失物登记,申请领取,拾得人开题报告内容一、选题的依据及意义1.1背景分析随着高校规模的不断扩大和学生数量的增加,校园内失物与寻物的现象日益频繁。传......