jackJson根據String類型枚舉值返回數據返回枚舉其餘參數

因alibaba阿里巴巴開發手冊規定java

【強制】二方庫裏能夠定義枚舉類型,參數能夠使用枚舉類型,可是接口返回值不容許使用枚
舉類型或者包含枚舉類型的 POJO 對象。
數據庫

因此就用這個方式返回枚舉中的其餘方法json

首先須要添加一個接口給到枚舉類實現app

import com.common.utils.i18n.I18nUtils;
import com.fasterxml.jackson.annotation.JsonProperty;

public interface BaseEnum {

  /**
   * 獲取I8N國際化key
   *
   * @return code
   */
  String key();

  /**
   * 獲取存入數據庫的值
   *
   * @return value
   */
  String value();

  /**
   * 獲取I18N國際化信息
   *
   * @return 國際化信息
   */
  @JsonProperty("Description")
  default String getDescription() {
    return I18nUtils.getEnumMessage(key());
  }

  @JsonProperty("Value")
  default String getValue() {
    return value();
  }
}

而後建立一個註解提供給到序列化識別並獲取參數ide

import com.common.comment.impl.EnumSerializer;
import com.fasterxml.jackson.annotation.JacksonAnnotationsInside;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**
 * 枚舉序列化返回參數
 */
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@JacksonAnnotationsInside
@JsonSerialize(using = EnumSerializer.class)
public @interface JaskonEnum {

  Class<?> enumClass();

  String methodName();
}

最後就是jackJson的序列化ui

import com.common.base.code.BaseExceptionCode;
import com.common.base.enums.BaseEnum;
import com.common.base.excetion.BaseException;
import com.common.comment.JaskonEnum;
import com.common.utils.logger.LoggerUtils;
import com.common.utils.verification.ValidateUtils;
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 java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import java.util.Objects;
import org.slf4j.Logger;

public class EnumSerializer extends JsonSerializer<String> implements ContextualSerializer {

  private Logger logger = LoggerUtils.logger(getClass());

  private Map<String, String> valueLabelMap;

  public EnumSerializer() {
  }

  public EnumSerializer(Map<String, String> valueLabelMap) {
    this.valueLabelMap = valueLabelMap;
  }

  @Override
  public void serialize(String o, JsonGenerator jsonGenerator, SerializerProvider serializerProvider)
      throws IOException {
    if (ValidateUtils.isEmpty(valueLabelMap)) {
      return;
    }
    jsonGenerator.writeString(o);
    String values = valueLabelMap.get(o);
    if (ValidateUtils.isEmpty(values)) {
      return;
    }
    String[] split = values.split(":");
    jsonGenerator.writeStringField(split[0], split[1]);
  }

  @Override
  public JsonSerializer<?> createContextual(SerializerProvider serializerProvider, BeanProperty beanProperty)
      throws JsonMappingException {
    if (ValidateUtils.isEmpty(beanProperty)) {
      return serializerProvider.findNullValueSerializer(beanProperty);
    }

    if (!Objects.equals(beanProperty.getType().getRawClass(), String.class)) {
      return serializerProvider.findValueSerializer(beanProperty.getType(), beanProperty);
    }

    JaskonEnum enumLabel = beanProperty.getAnnotation(JaskonEnum.class);
    if (ValidateUtils.isEmpty(enumLabel)) {
      return serializerProvider.findValueSerializer(beanProperty.getType(), beanProperty);
    }
    // key:getValue value:getLabel
    // 枚舉類的成員
    BaseEnum[]          enumInstances = (BaseEnum[]) enumLabel.enumClass().getEnumConstants();
    Map<String, String> map           = new HashMap<>(enumInstances.length);
    try {
      String prefix = enumLabel.methodName();
      for (BaseEnum baseEnum : enumInstances) {
        String value       = baseEnum.getValue();
        String description = baseEnum.getDescription();
        map.put(value, new StringBuilder().append(prefix).append(":").append(description).toString());
      }
    } catch (Exception e) {
      logger.error("jackJson 轉義註解失敗,失敗異常爲 e:{}",e);
      throw new BaseException(BaseExceptionCode.BASE_EXCETION_CODE);
    }
    return new EnumSerializer(map);
  }

這樣子便可實現返回枚舉參數同時,一併返回enum中的getDescription出去,若是須要返回多個參數能夠修改baseEnum增長方法this

相關文章
相關標籤/搜索