JAVA--fastJSON+⾃定义注解格式化实体字段
公司有个需求,给所有⾝份证,姓名,银⾏卡号,后台打印⽇志进⾏格式化如:⾝份证:431103******9999,姓名:张*红。主要作⽤是为了保密商户的资料。
拿到这样⼀个需求的时候,我⾸先想到的是,那么多个实体,每个实体⾝份证,姓名,银⾏卡可能字段命名是不⼀样的,那我怎么去做⼀个通⽤的⽅法,怎么才知道某个实体中某个字段需要进⾏格式化,是进⾏什么类型的格式~
经过思考,查资料确定fastjson+fastjson过滤器+java⾃定义注解+java反射。Fastjson⽤于以json的⽅式打印对象⽇志,java注解⽤于标识某个实体类中某个字段需要进⾏何种格式化,加上java反射,后⾯新增实体某个字段需要进⾏格式化直接添加⼀个⾃定义注解,然后调⽤fastjson+过滤器即可进⾏格式化。⼀劳永逸呀!
实例如下:
Fastjson过滤器
import flect.Field;
import org.apache.log4j.Logger;
import org.springframework.util.StringUtils;
import com.alibaba.fastjson.serializer.ValueFilter;
import ansfer.bean.FieldFomatAnnotation;
import ums.AnnotationFomatType;
/**
*
* 类名称:BeanPropertyFilter
* 类描述: 进⾏字段值格式化,如银⾏卡,收付款⼈姓名,⾝份证号
* 创建⼈:boys
* 创建时间:2017年7⽉17⽇下午4:05:41
*
*/
public class BeanPropertyFilter implements ValueFilter{
private static final Logger logger =Logger(BeanPropertyFilter.class);
private Field field =null;
@Override
public Object process(Object obj, String name, Object value) {
try {
field = Class().getDeclaredField(name);
value = getFormartValue( field , value );
} catch(NoSuchFieldException e){
return value;
}catch (Exception e) {
<(obj+"BeanPropertyFilter CustomsInfo解析格式化file异常:",e);
return value;
}
return value;
}
private static Object getFormartValue(Field field,Object value ){
if(field.isAnnotationPresent(FieldFomatAnnotation.class)){
AnnotationFomatType formatType = Annotation(FieldFomatAnnotation.class).formatType();
//进⾏格式化
value = formart(formatType,value);
fastjson怎么用}
return value;
}
private static Object formart(AnnotationFomatTypeformatType,Object obj){
String formatValue = "";
if(obj==null){
return"";
}else if(obj instanceof String){
formatValue = (String) obj;
}else{
return"⾮String类型!";
}
//银⾏卡格式化
if(formatType.equals(AnnotationFomatType.BANK_NUM)){
}
//姓名格式化
if(formatType.equals(AnnotationFomatType.NAME)){
}
//⾝份证号格式化
if(formatType.equals(AnnotationFomatType.ID_CARD)){
}
return"";
}
}
⾃定义注解
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import ums.AnnotationFomatType;
/**
*
* 类名称:FieldFomatAnnotation
* 类描述:⽤于注解实体类字段,打印⽇志格式化,如银⾏卡: 6225***2882;姓名:张**斌 * 创建⼈:boys
* 创建时间:2017年7⽉14⽇下午1:50:21
*
*/
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
public@interface FieldFomatAnnotation {
public AnnotationFomatType formatType();
}
格式化类型枚举类
/** 注解格式化类型,姓名格式化,银⾏卡号格式化 */
public enum AnnotationFomatType {
/** 姓名 */
NAME,
/** 银⾏卡 */
BANK_NUM,
/**⾝份证*/
ID_CARD;
public String getName() {
return this.name();
}
public Integer getOrdinal() {
dinal();
}
}
需要格式化的实体类
public class TransferOrderBill implements java.io.Serializable { private static final long serialVersionUID = 7198819025939762530L;
//企业提供 20位唯⼀码
private String serialNum;
//付款⼈姓名
@FieldFomatAnnotation(formatType = AnnotationFomatType.NAME)
private String cardHolder;
//付款⼈账号
@FieldFomatAnnotation(formatType = AnnotationFomatType.BANK_NUM) private String bankAccount;
//get set⽅法
}
测试
Main⽅法测试
import com.alibaba.fastjson.JSONObject;
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论