actual combat 23 —— 通过序列化对字典字段生成字典str字段和对应字典标签值

  • 注解:@JsonSerialize(using = DictSerializer.class)
package com.zyjk.common.core.json;import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.databind.BeanProperty;
import com.fasterxml.jackson.databind.JsonMappingException;
import com.fasterxml.jackson.databind.JsonSerializer;
import com.fasterxml.jackson.databind.SerializerProvider;
import com.fasterxml.jackson.databind.ser.ContextualSerializer;
import com.zyjk.common.core.utils.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.zyjk.common.core.annotation.DictType;
import com.zyjk.common.core.utils.DictUtils;import java.io.IOException;
import java.util.Objects;public class DictSerializer extends JsonSerializer<Object> implements ContextualSerializer {private final Logger log = LoggerFactory.getLogger(DictSerializer.class);/*** 生成序列化字段后缀*/private static final String LABEL_SUFFIX = "Str";/*** 字典配置信息*/private DictType dictType;public DictSerializer() {super();}public DictSerializer(DictType dictType) {this.dictType = dictType;}@Overridepublic JsonSerializer<?> createContextual(SerializerProvider serializerProvider, BeanProperty property) throws JsonMappingException {DictType dictAnno = property.getAnnotation(DictType.class);return new DictSerializer(dictAnno);}@Overridepublic void serialize(Object value, JsonGenerator generator, SerializerProvider serializerProvider) throws IOException {serializerProvider.defaultSerializeValue(value, generator);String fieldName = generator.getOutputContext().getCurrentName();generator.writeStringField(fieldName.concat(LABEL_SUFFIX), value != null ? this.getDictLabel(dictType, value) : null);}/*** 获取字典信息** @param dictType 字典类型* @param value    字典值* @return 字典标签*/private String getDictLabel(DictType dictType, Object value) {try {String propertyValue = Objects.toString(value);if(StringUtils.isNotEmpty(dictType.readConverterExp())){return convertByExp(propertyValue,dictType.readConverterExp(),null);}String[] values = propertyValue.split(",");String label = null;for(String var : values){if (StringUtils.isNotEmpty(var)){if (label == null) {label = DictUtils.getDictLabel(dictType.value(), var);} else {label  += "," + DictUtils.getDictLabel(dictType.value(), var);}} else {if (label == null) {label = "";}}}return label;} catch (Exception e) {log.error("字典转换:获取字典描述异常,使用默认值:{},key:{}, dict:{}, 异常:{}", dictType.defaultValue(), value, dictType.value(), e.getMessage());return dictType.defaultValue();}}/*** 解析导出值 0=男,1=女,2=未知** @param propertyValue 参数值* @param converterExp  翻译注解* @param separator     分隔符* @return 解析后值*/private String convertByExp(String propertyValue, String converterExp, String separator) {StringBuilder propertyString = new StringBuilder();String[] convertSource = converterExp.split(",");for (String item : convertSource) {String[] itemArray = item.split("=");if (StringUtils.isNotEmpty(separator) && StringUtils.containsAny(separator, propertyValue)) {for (String value : propertyValue.split(separator)) {if (itemArray[0].equals(value)) {propertyString.append(itemArray[1]).append(separator);break;}}} else {if (itemArray[0].equals(propertyValue)) {return itemArray[1];}}}return StringUtils.stripEnd(propertyString.toString(), separator);}
}
  • 注解:@DictType
package com.zyjk.common.core.annotation;import java.lang.annotation.*;@Documented
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface DictType {/** 字典类型 */String value() default "";/** 未查到字典值时的默认值 */String defaultValue() default "";/*** 读取内容转表达式 (如: 0=男,1=女,2=未知)*/String readConverterExp() default "";
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/174185.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【JavaEE初阶】 博客系统项目--前端页面设计实现

文章目录 &#x1f332;主要内容&#x1f38d;预期效果&#x1f6a9;博客列表页效果&#x1f6a9;博客详情页&#x1f6a9;博客登录页&#x1f6a9;博客编辑页 &#x1f340;实现博客列表页&#x1f6a9;实现导航栏&#x1f388;页面主体部分 &#x1f384;实现博客详情页&…

使用@autowired 多次插入 修改 会数据出错问题

我这段时间 发现的一个问题 如下 使用 Autowired标注一个 类 Autowired ABC abc ;类如下 Date class ABC { A a&#xff1b; B b&#xff1b; C c&#xff1b; }当第一次插入 abc{ a1&#xff1b; b2&#xff1b; cnull&#xff1b; }成功插入a1&#xff1b;b2&#xff1b;…

【多线程】-- 04 静态代理模式

多线程 3 静态代理 这里以一个现实生活中的例子来解释并实现所谓的静态代理模式&#xff0c;即结婚者雇用婚庆公司来帮助自己完成整个婚礼过程&#xff1a; package com.duo.lambda;interface Marry {void HappyMarry();//人生四大乐事&#xff1a;久旱逢甘霖&#xff1b;他…

文件元数据批量修改:mp3音频和mp4视频的元数据如何批量修改

在数字媒体处理和管理的日常工作中&#xff0c;文件元数据的批量修改是一个常见的需求。元数据&#xff0c;或者称为文件信息&#xff0c;可以包括文件的创建日期、修改日期、文件名、文件大小、标签等。在音乐和视频处理领域&#xff0c;例如对mp3音频和mp4视频文件&#xff0…

linux下的工具---gdb

一、gdb简介 GDB,是The GNU Project Debugger 的缩写&#xff0c;是 Linux 下功能全面的调试工具。 GDB支持断点、单步执行、打印变量、观察变量、查看寄存器、查看堆栈等调试手段。 程序的发布方式有两种&#xff0c;debug模式和release模式 Linux gcc/g出来的二进制程序&am…

自驾游汽车托运是交智商税吗?

自驾游汽车托运是交智商税吗? 亲爱的小伙伴们 你们有没有遇到过这样的困扰&#xff1a; 自驾游时&#xff0c;车辆的运输问题让你头疼不已? 是选择自己驾驶还是托运呢? 今天&#xff0c;我就来给大家种草一下汽车托运的好处&#xff0c; 让你的自驾游之旅更加轻松愉快! 1️.…

安防视频监控/磁盘阵列/集中云存储平台EasyCVR设备录像保活不生效原因是什么?该如何解决?

安防视频监控/视频集中存储/云存储/磁盘阵列EasyCVR平台可拓展性强、视频能力灵活、部署轻快&#xff0c;可支持的主流标准协议有国标GB28181、RTSP/Onvif、RTMP等&#xff0c;以及支持厂家私有协议与SDK接入&#xff0c;包括海康Ehome、海大宇等设备的SDK等。平台既具备传统安…

LeetCode题:581. 最短无序连续子数组,242. 有效的字母异位词,202. 快乐数

581. 最短无序连续子数组 题目要求&#xff1a; 581. 最短无序连续子数组 给你一个整数数组 nums &#xff0c;你需要找出一个 连续子数组 &#xff0c;如果对这个子数组进行升序排序&#xff0c;那么整个数组都会变为升序排序。 请你找出符合题意的 最短 子数组&#xff0c;…

【Linux】安卓端JuiceSSH结合内网穿透实现远程连接服务器

目录 前言1. Linux安装cpolar2. 创建公网SSH连接地址3. JuiceSSH公网远程连接4. 固定连接SSH公网地址5. SSH固定地址连接测试 前言 处于内网的虚拟机如何被外网访问呢&#xff1f;如何手机就能访问虚拟机呢&#xff1f; 本文介绍 cpolarJuiceSSH 实现手机端远程连接Linux虚拟…

4.golang中map的增删改查

map 一种无序的键值对, 它是数据结构 hash 表的一种实现方式。map工作方式就是&#xff1a;定义键和值&#xff0c;并且可以获取&#xff0c;设置和删除其中的值。 声明 // 使用关键字 map 来声明 bMap : map[string]int{"key1": 18} // 使用make来声明 cMap : mak…

elk日志分析系统:

elk日志分析系统: elk是一套完整的日志集中处理方案&#xff0c;由三个开源的软件简称组成&#xff1b; E:Easticsearch 简称ES是一个开源的&#xff0c;分布式的存储检索引擎&#xff0c;&#xff08;索引型的非关系数据库&#xff09;存储日志 由java代码开发的&#xff0…

CSC公派博士后|管理学老师赴韩国首尔大学达成目标

J老师自身背景正好卡在CSC公派博士后申报条件的边缘&#xff0c;为增大通过概率&#xff0c;其提出优选亚洲范围内的世界知名高校、专业相符、2年博士后职位的要求。最终我们用韩国首尔大学的邀请函助其顺利获批CSC&#xff0c;实现了所有既定目标。 J老师背景&#xff1a; 申…

24. 两两交换链表中的节点

​​题目来源&#xff1a; leetcode题目&#xff0c;网址&#xff1a;24. 两两交换链表中的节点 - 力扣&#xff08;LeetCode&#xff09; 解题思路&#xff1a; 遍历时交换即可。 解题代码&#xff1a; /*** Definition for singly-linked list.* struct ListNode {* i…

外贸企业如何搭建合适的B2B独立站

随着全球电子商务的快速发展&#xff0c;越来越多的外贸企业开始关注并投入到B2B独立站的搭建中。B2B独立站不仅可以提升企业的品牌形象&#xff0c;还可以拓展销售渠道&#xff0c;提高销售效率。然而&#xff0c;如何搭建一个适合的外贸B2B独立站&#xff0c;却需要从多个方面…

开发者在分发平台上传和发布APP的步骤

注册账号&#xff1a;首先&#xff0c;开发者需要在分发平台上注册一个账号。这个账号将用于管理你的应用程序和进行相关操作。完善信息&#xff1a;注册完成后&#xff0c;开发者需要完善个人信息&#xff0c;包括姓名、联系方式等。这将有助于建立信任关系&#xff0c;并与用…

【Tiny_CD】Tiny_CD变化检测网络详解(含python代码)

题目:TinyCD: A (Not So) Deep Learning Model For Change Detection 论文:paper 代码:code 目录 🍟 🍟1.摘要 🍗🍗 2.贡献 🍖🍖 3.网络结构

前端必学——实现电商图片放大镜效果(附代码)

放大镜可以说是前端人必须学会的程序之一,今天的案例为大家展示一下怎么实现放大镜的效果&#xff01; 效果图展示 整个效果就是当鼠标放到展示图上的时候&#xff0c;会出现一个遮罩层以及弹出来一个框展示一个详情图&#xff0c;并且鼠标移动的时候详情图跟着移动&#xff0…

android 动态创建selector状态选择器 动态创建Drawable

最近在做一个使用接口返回的字符串&#xff1a;"#ff0000" 来动态设置drawable背景颜色与动态设置状态选择器selector的需求&#xff0c;之前写习惯了shape的xml&#xff0c;还是第一次写动态的&#xff0c;有点搞笑&#xff0c;搞笑的是自己没写过&#xff0c;不知道…

家乡旅游推广软文怎么写?媒介盒子分享

随着各地政策的放开&#xff0c;旅行已经成为很多消费者生活中不可缺少的一项&#xff0c;各地景区也在宣传上纷纷发力&#xff0c;希望能够吸引游客。只要文案写得好&#xff0c;没有景点火不了&#xff0c;今天媒介盒子就来和大家聊聊&#xff1a;家乡旅游推广软文怎么写。 一…