FastJson序列化和反序列化时处理数据
创始人
2024-05-25 05:25:19

FastJson序列化和反序列化时处理数据

  • 序列化时处理数据
  • 反序列化时处理json数据中的值

https://github.com/alibaba/fastjson/wiki/PropertyProcessable_cn
https://www.cnblogs.com/ariter/p/14254342.html

序列化时处理数据

1、自定义注解用来标识json数据需要处理的属性

import java.lang.annotation.*;/*** 用于标识需要加密的字段*/
@Target({ElementType.FIELD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Inherited
public @interface EncryptionField {}

2、fastJson的值过滤器,对使用【EncryptionField】标注的字段加密

import com.alibaba.fastjson.serializer.ValueFilter;
import com.sinosoft.encrypt.utils.CryptoUtil;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Value;import java.lang.reflect.Field;
import java.util.Objects;/*** 对使用【EncryptionField】标注的字段加密*/
public class EncryptionFieldFilter implements ValueFilter {/*** 加密key*/@Value("${privacy.crypto.key}")private String encryptKey;public EncryptionFieldFilter() {}@Overridepublic Object process(Object object, String name, Object value) {try {Field field = object.getClass().getDeclaredField(name);if (Objects.isNull(value) || String.class != field.getType() || (field.getAnnotation(EncryptionField.class)) == null) {return value;}if (StringUtils.isEmpty(field.toString())) {return value;}return CryptoUtil.sm4Encrypt(value.toString(), encryptKey);} catch (Exception e) {}return value;}
}

3、在需要处理的属性上增加注解

import com.cbex.partyconstruction.common.annotation.EncryptionField;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.experimental.Accessors;@Data
@Accessors(chain = true)
public class MyPartyManageInfo {@ApiModelProperty(value = "职工姓名")private String name;@ApiModelProperty(value = "证件类型")private String cardType;@ApiModelProperty(value = "证件号码")@EncryptionFieldprivate String cardId;
}

将对象转换成json串

public class Test {public static void main(String[] args) throws Exception {MyPartyManageInfo partyManageInfo = new MyPartyManageInfo();partyManageInfo.setCardId("111111").setCardType("居民身份证").setName("职工");String s = JSONObject.toJSONString(partyManageInfo,new EncryptionFieldFilter());System.out.println("card加密后的Json串是------"+s);}}

结果如下图,证件号码加密了
在这里插入图片描述

反序列化时处理json数据中的值

1、定义类实现PropertyProcessable 接口,处理需要处理的属性值

PropertyProcessable是1.2.35版本开始支持的自定义反序列化接口。

interface PropertyProcessable {// 返回property的类型,如果返回空,则由parser自行推断。Type getType(String name);// 处理属性值void apply(String name, Object value);
}
import com.alibaba.fastjson.parser.deserializer.PropertyProcessable;
import com.sinosoft.encrypt.utils.CryptoUtil;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import org.apache.commons.lang3.StringUtils;import java.lang.reflect.Type;@Data
public class MyPropertyProcessableResolver implements PropertyProcessable {@ApiModelProperty(value = "职工姓名")private String name;@ApiModelProperty(value = "证件类型")private String cardType;@ApiModelProperty(value = "证件号码")private String cardId;public MyPropertyProcessableResolver() {}@Overridepublic Type getType(String name) {return null;}@Overridepublic void apply(String name, Object value) {if(StringUtils.equals("cardId",name)){this.cardId = CryptoUtil.sm4Decrypt(value.toString(), null);}else if(StringUtils.equals("cardType",name)){this.cardType = (String) value;}else if(StringUtils.equals("name",name)){this.name = (String) value;}}
}

2、反序列化

import com.alibaba.fastjson.JSONObject;
import com.cbex.partyconstruction.common.annotation.EncryptionFieldFilter;
import com.cbex.partyconstruction.manage.domain.po.MyPartyManageInfo;
import com.cbex.partyconstruction.manage.domain.po.MyPropertyProcessableResolver;public class Test {public static void main(String[] args) throws Exception {MyPartyManageInfo partyManageInfo = new MyPartyManageInfo();partyManageInfo.setCardId("111111").setCardType("居民身份证").setName("职工");String s = JSONObject.toJSONString(partyManageInfo,new EncryptionFieldFilter());System.out.println("card加密后的Json串是------"+s);MyPropertyProcessableResolver partyManageInfoVo = JSONObject.parseObject(s, MyPropertyProcessableResolver.class);System.out.println("json串转换成对象是------"+partyManageInfoVo);}
}

在这里插入图片描述

相关内容

热门资讯

北京的名胜古迹 北京最著名的景... 北京从元代开始,逐渐走上帝国首都的道路,先是成为大辽朝五大首都之一的南京城,随着金灭辽,金代从海陵王...
苗族的传统节日 贵州苗族节日有... 【岜沙苗族芦笙节】岜沙,苗语叫“分送”,距从江县城7.5公里,是世界上最崇拜树木并以树为神的枪手部落...
怎么样的桃花 桃花近看远看的样... 今年的“三八”妇女节,阳光明媚,踏青赏花正当时。遂与姐妹们共赴十里蓝山,与花海来一场春天的约会。十里...
应用未安装解决办法 平板应用未... ---IT小技术,每天Get一个小技能!一、前言描述苹果IPad2居然不能安装怎么办?与此IPad不...
脚上的穴位图 脚面经络图对应的... 人体穴位作用图解大全更清晰直观的标注了各个人体穴位的作用,包括头部穴位图、胸部穴位图、背部穴位图、胳...
demo什么意思 demo版本... 618快到了,各位的小金库大概也在准备开闸放水了吧。没有小金库的,也该向老婆撒娇卖萌服个软了,一切只...
长白山自助游攻略 吉林长白山游... 昨天介绍了西坡的景点详细请看链接:一个人的旅行,据说能看到长白山天池全凭运气,您的运气如何?今日介绍...
世界上最漂亮的人 世界上最漂亮... 此前在某网上,选出了全球265万颜值姣好的女性。从这些数量庞大的女性群体中,人们投票选出了心目中最美...
猫咪吃了塑料袋怎么办 猫咪误食... 你知道吗?塑料袋放久了会长猫哦!要说猫咪对塑料袋的喜爱程度完完全全可以媲美纸箱家里只要一有塑料袋的响...
苗族的传统节日 贵州苗族节日有... 【岜沙苗族芦笙节】岜沙,苗语叫“分送”,距从江县城7.5公里,是世界上最崇拜树木并以树为神的枪手部落...
北京的名胜古迹 北京最著名的景... 北京从元代开始,逐渐走上帝国首都的道路,先是成为大辽朝五大首都之一的南京城,随着金灭辽,金代从海陵王...
怎么样的桃花 桃花近看远看的样... 今年的“三八”妇女节,阳光明媚,踏青赏花正当时。遂与姐妹们共赴十里蓝山,与花海来一场春天的约会。十里...
应用未安装解决办法 平板应用未... ---IT小技术,每天Get一个小技能!一、前言描述苹果IPad2居然不能安装怎么办?与此IPad不...
脚上的穴位图 脚面经络图对应的... 人体穴位作用图解大全更清晰直观的标注了各个人体穴位的作用,包括头部穴位图、胸部穴位图、背部穴位图、胳...
长白山自助游攻略 吉林长白山游... 昨天介绍了西坡的景点详细请看链接:一个人的旅行,据说能看到长白山天池全凭运气,您的运气如何?今日介绍...
猫咪吃了塑料袋怎么办 猫咪误食... 你知道吗?塑料袋放久了会长猫哦!要说猫咪对塑料袋的喜爱程度完完全全可以媲美纸箱家里只要一有塑料袋的响...
demo什么意思 demo版本... 618快到了,各位的小金库大概也在准备开闸放水了吧。没有小金库的,也该向老婆撒娇卖萌服个软了,一切只...
世界上最漂亮的人 世界上最漂亮... 此前在某网上,选出了全球265万颜值姣好的女性。从这些数量庞大的女性群体中,人们投票选出了心目中最美...