当前位置: 首页 > article >正文

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;
    }

    @Override
    public JsonSerializer<?> createContextual(SerializerProvider serializerProvider, BeanProperty property) throws JsonMappingException {
        DictType dictAnno = property.getAnnotation(DictType.class);
        return new DictSerializer(dictAnno);
    }

    @Override
    public 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.kler.cn/a/146577.html

相关文章:

  • C++单例模式的设计
  • 15. 三数之和【力扣】--三指针
  • [AI部署-tensorRT] customlayer定义添加过程解析
  • MYSQL学习笔记(二):SELECT基本查询
  • leetcode hot 100 -划分字母区间
  • 初识算法和数据结构P1:保姆级图文详解
  • JVM基础篇:垃圾回收
  • 十大排序算法中的插入排序和希尔排序
  • 【UE5】五大基类及其使用
  • 新闻研究导刊杂志社新闻研究导刊杂志新闻研究导刊编辑部2023年第21期目录
  • 第7章-使用统计方法进行变量有效性测试-7.3-列联表分析与卡方检验
  • 系列二十三、将一个第三方的类配置成bean的方式
  • 树莓派 cpolar实现内网穿透
  • git 泄露
  • SpringCloud实用-OpenFeign整合okHttp
  • Vue3:利用vueusejs键盘绑定
  • 创建可以离线打包开发的uniapp H5项目
  • MySQL数据库 编程入门
  • 【Python】使用globals()函数成功解决tkinter多个新窗口问题
  • hdlbits系列verilog解答(Exams/m2014 q4h)-44
  • ros2智能小车中STM32地盘需要用到PWM的模块
  • C++——解锁string常用接口
  • Flutter桌面应用开发之毛玻璃效果
  • Google codelab WebGPU入门教程源码<4> - 使用Uniform类型对象给着色器传数据(源码)
  • C#,《小白学程序》第一课:初识程序,变量,数据与显示
  • 时间序列预测 — LSTM实现多变量多步负荷预测(Keras)