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

news2024/11/27 18:33:30

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() {

    }

    @Override
    public 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 = "证件号码")
    @EncryptionField
    private 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() {

    }


    @Override
    public Type getType(String name) {
        return null;
    }

    @Override
    public 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);
    }
}

在这里插入图片描述

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

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

相关文章

ESP32S3系列--SPI主机驱动详解(二)

一、目的 在上一篇《ESP32S3系列--SPI主机驱动详解(一)》我们介绍了ESP32S3的SPI外设的基本情况以及主机驱动的一些知识点,包括主机驱动的特点、总线的初始化、从设备的加入、传输模式分类等等。 本篇我们将从代码角度帮助大家进一步理解传输接口的一些细节问题。 二、实战 …

6个常见的 PHP 安全性攻击

了解常见的PHP应用程序安全威胁,可以确保你的PHP应用程序不受攻击。因此,本文将列出 6个常见的 PHP 安全性攻击,欢迎大家来阅读和学习。 1、SQL注入 SQL注入是一种恶意攻击,用户利用在表单字段输入SQL语句的方式来影响正常的SQL执…

Blender——物体的随机分布

问题描述将正方体随机分布在平面上。问题解决点击编辑-->偏好设置。在【插件】中的【物体】类型中勾选【Object: Scatter Objects】。右下的活动工具与工作区设置中就会出现【物体散列】的模块,可以调节各参数。选中正方体,按着Shift,选中…

关于 OAuth 你又了解哪些?

作者罗锦华,API7.ai 技术专家/技术工程师,开源项目 pgcat,lua-resty-ffi,lua-resty-inspect 的作者。 OAuth 的背景 OAuth,O 是 Open,Auth 是授权,也就是开放授权的意思。OAuth 始于 2006 年&a…

error when starting dev server:Error: Failed to resolve vue/compiler-sfc.

对于node 的包管理工具,我一般习惯用 yarn,但是最近使用 yarn 创建前端项目的时候出了一些问题。yarn create vite vite-project报错如下:error when starting dev server:Error: Failed to resolve vue/compiler-sfc.vitejs/plugin-vue requ…

[Arxiv 2022] A Novel Plug-in Module for Fine-Grained Visual Classification

Contents MethodPlug-in ModuleLoss functionExperimentsReferencesMethod Plug-in Module Backbone:为了帮助模型抽取出不同尺度的特征,作者在 backbone 里加入了 FPNWeakly Supervised Selector:假设 backbone 的 i i

LayUI渲染数据失败之Ajax异步交互

案例 在layui中调用jquery的ajxa,返回数据,赋值给全局变量,通过DOM渲染到页面。 //定义变量 let sale;//定义请求 $.ajax({type: "GET",url: "http://localhost:8080/product/sale",data: null,dataType: "json&q…

离散数学 课时一 命题逻辑的基本概念

1 命题 1、命题:可以判断其真值的陈述句 2、真值:真或者假(1或者0) 3、真命题:真值为真的命题 4、假命题:真值为假的命题 5、原子命题:不可以再被分解成更简单的命题 6、复合命题:由原子命题通过联结词联结…

12 Day:内存管理

前言:今天我们要完成我们操作系统的内存管理,以及一些数据结构和小组件的实现,在此之前大家需要了解我们前几天一些重要文件的内存地址存放在哪,以便我们更好的去编写内存管理模块 一,实现ASSERT断言 不知道大家有没有…

< Linux >:Linux 进程概念 (4)

目录 五、孤儿进程 六、进程优先级 6.1、基本概念 6.2、查看时实系统进程 6.3、PRI and NI 七、其他概念 四、X 状态:死亡状态 所谓进程处于 X 状态(死亡状态)代表的就是该进程已经死亡了,即操作系统可以随时回收它的资源(操作系统也可以…

代码质量与安全 | 开发人员必备的安全编码实践指南

在任何新的软件开发项目开始时,您就应该考虑软件安全。开始一个新项目或许会令人望而生畏,因为有许多的决定要做,有许多想法必须考虑清楚。通常来说,这些决定和想法包括了定义项目需求、选择正确的流程、选择正确的工具以及确保软…

QML- 导入库包语法

QML- 导入库包语法一、概述二、Import语句的语法1. Module (namespace) 模块(命名空间)导入1. 非模块命名空间的导入2. 导入到限定局部命名空间2. 路径 import1. 本地目录导入2. 远程目录3. JavaScript资源导入三、QML导入路径四、调试一、概述 import 语句其实在QML文档里面体…

Springboot扩展点之SmartInstantiationAwareBeanPostProcessor

前言这是Springboot扩展点系列的第5篇了,主要介绍一下SmartInstantiationAwareBeanPostProcessor扩展点的功能特性、和实现方式。SmartInstantiationAwareBeanPostProcessor与其他扩展点最明显的不同,就是在实际的业务开发场景中应用到的机会并不多&…

机器学习框架sklearn之特征降维

目录特征降维概念特征选择过滤式①低方差特征过滤②相关系数③主成分分析特征降维 0维 标量 1维 向量 2维 矩阵 概念 降维是指在某些限定条件下,降低随机变量(特征)个数,得到一组“不相关”主变量的过程 注:正是…

微信小程序 java 医生预约挂号答疑问询系统

生预约答疑系统用户端是基于微信小程序端,医生和管理员是基于网页后端。本系统分为用户,管理员,医生三个角色,用户的主要功能是注册登陆小程序,查看新闻资讯,查看医生列表,预约医生,…

【unity细节】关于资源商店(Package Maneger)无法下载资源问题的解决

👨‍💻个人主页:元宇宙-秩沅 hallo 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅! 本文由 秩沅 原创 收录于专栏:unity细节和bug ⭐关于资源商店为何下载不了的问题⭐ 文章目录⭐关于资源商店为何下载不了的问题…

鸟哥的Linux私房菜读书笔记:文件系统的简单操作

磁盘与目录的容量 现在我们知道磁盘的整体数据实在superblock区块中,但是每个个别文件的容量则在inode当中记载的. 那在命令行下面该如何显示处这几个数据呢? df:列出文件系统的整体磁盘书用量du:评估文件系统的磁盘使用量(常用在推估目录所占容量)df先来说明一下范例一所输…

网络协议(四):网络互联模型、物理层、数据链路层

网络协议系列文章 网络协议(一):基本概念、计算机之间的连接方式 网络协议(二):MAC地址、IP地址、子网掩码、子网和超网 网络协议(三):路由器原理及数据包传输过程 网络协议(四):网络互联模型、物理层、数据链路层 目录一、网…

HER2靶向药物研发进展-销售数据-上市药品前景分析

HER2长期作为肿瘤领域的热门靶点之一,其原因是它在多部位、多种形式的癌症中均有异常的表达,据研究表明HER2除了在胃癌、胆道癌、胆管癌、乳腺癌、卵巢癌、结肠癌、膀胱癌、肺癌、子宫颈癌、子宫浆液性子宫内膜癌、头颈癌、食道癌中的异常表达还存在于多…

从0到0.1学习 maven(三:声明周期、插件、聚合与继承)

该文章为maven系列学习的第三篇,也是最后一篇 第一篇快速入口:从0到0.1学习 maven(一:概述及简单入门) 第二篇快速入口:从0到0.1学习 maven(二:坐标、依赖和仓库) 文章目录啥子叫生命周期生命周期详解clean生命周期def…