`

FastJson添加mark隐藏字符

    博客分类:
  • Java
阅读更多
我们要做的是一个基于日志打印时候需要对敏感信息进行加密。简单的来说。就是比如你的身份证号码是145267267889297929X,让在日志打印时候显示1452******29X这个样子。
为了满足需求研究了下阿里的fastjson。
fastjson具有高度的可控性,可以自己定制序列化,比如当中有注解处理的
1.通过@JSONField定制序列化
2.通过@JSONType定制序列化
具体的使用:
@JSONField(serialize=false) //不进行序列化的字段
@JSONField(name="usname") //修改序列化的输出的属性值
@JSONType(ignores ={"id", "sex"}) //在类上修饰
@JSONType(includes={"name","sex"}) //序列化包括哪些字段

注解在使用时候比较简单,但是不是我要的效果,并且注解在序列化时候需要解析注解,性能不是很好。所以我这里使用的是SerializeFilter定制处理。
   protected List<BeforeFilter>       beforeFilters       = null;
    protected List<AfterFilter>        afterFilters        = null;
    protected List<PropertyFilter>     propertyFilters     = null;
    protected List<ValueFilter>        valueFilters        = null;
    protected List<NameFilter>         nameFilters         = null;
    protected List<PropertyPreFilter>  propertyPreFilters  = null;
    protected List<LabelFilter>        labelFilters        = null;
    protected List<ContextValueFilter> contextValueFilters = null;
//fastjson提供了多种SerializeFilter:在JSON.toJSONString
PropertyPreFilter: 根据PropertyName判断是否序列化;
PropertyFilter: 根据PropertyName和PropertyValue来判断是否序列化;
NameFilter: 修改Key,如果需要修改Key,process返回值则可;
ValueFilter: 修改Value;
BeforeFilter: 序列化时在最前添加内容;
AfterFilter: 序列化时在最后添加内容;
LabelFilter:重新写

创建我们需要使用验证的类
//忽略set,get操作
class Lists {
    public String name;

    public Lists(String name) {
        this.name = name;
    }
}

class Logger {
    private String name;
    private String idNum;
    private Lists name1=new Lists("333");

    public Logger(String name, String idNum) {
        this.name = name;
        this.idNum = idNum;
    }
}


PropertyPreFilter: 根据PropertyName判断是否序列化;
使用的时候我们使用SimplePropertyPreFilter,不然就和PropertyFilter没有什么区别了
//先看看源码,我们看见excludes属性就没有使用,所有我们只能配置需要序列化的属性
public class SimplePropertyPreFilter implements PropertyPreFilter {
    private final Class<?>    clazz;
    private final Set<String> includes = new HashSet<String>();
    private final Set<String> excludes = new HashSet<String>();
    private int               maxLevel = 0;

    public SimplePropertyPreFilter(String... properties){
        this(null, properties);
    }

    public SimplePropertyPreFilter(Class<?> clazz, String... properties){
        super();
        this.clazz = clazz;
        for (String item : properties) {
            if (item != null) {
                this.includes.add(item);
            }
        }

...
//执行代码
 System.out.println(LogSecurity.toJSONString(new Logger("Janle", "1872871278"), new SimplePropertyPreFilter(Logger.class,"name")));
//执行结果
{"name":"Janle"}


PropertyFilter:指定属性进行序列化
我简单做了一个处理,将只输出对应name的序列化。
//如果想输出lists的name自己可以看看,值需要做个判断就可以。
System.out.println(LogSecurity.toJSONString(new Logger("Janle", "1872871278"), new PropertyFilter() {
            @Override
            public boolean apply(Object object, String name, Object value) {
                return name.equals("name")?true:false;
            }
        }));
//执行结果
{"name":"Janle"}

NameFilter :就是修改对象的属性序列化后的显示
ValueFilter :序列化时修改value,我就是需要用到这个,主要做了如下处理
/**
 * 主要是对日志输出时候的序列化操作。
 * Created by lijianzhen1 on 2017/9/5.
 */
public class LogMarkFilter implements ValueFilter {
    /**
     * 添加mark的工具类
     */
    private final WebMarkUtils markUtils;
    /**
     * 对应需要的属性
     */
    private Map<String, Boolean> params = Maps.newHashMap();

    public LogMarkFilter(String... params) {
        this.markUtils = new WebMarkUtils();
        for (String param : params)
            this.params.put(param, Boolean.TRUE);
    }

    @Override
    public Object process(Object object, String name, Object value) {
        if (null != params.get(name)
                && params.get(name)
                && value instanceof String) {
            //执行mark操作
            return markUtils.getMarkInfo(value.toString());
        }
        return value;
    }
}


BeforeFilter: 序列化时在最前添加内容;
 System.out.println(LogSecurity.toJSONString(new Logger("Janle", "1872871278"), new BeforeFilter() {
            @Override
            public void writeBefore(Object object) {
                writeKeyValue("aaa","333");
            }
        }));
执行后的结果在json的每个对象前添加固定的属性
{"aaa":"333","idNum":"1872871278","name":"Janle","name1":{"aaa":"333","name":"333"}}


AfterFilter: 序列化时在最后添加内容;同上,


LabelFilter:序列化时候会找到对应注解
我们字段上加上对应的label的值 System.out.println(JSONArray.toJSONString(new
Logger("Janle", "1872871278"), Labels.includes("name"))); @JSONField(label = "name") 
执行结果就是我们想要的

ContextValueFilter:这个就自己可自己按照注解方式和自己定义一些要解析的注解,看看源码:
Object process(BeanContext context, Object object, String name, Object value);

里边比别的多了一个context,你可以获得对应bean的所有属性,你也可以找到你想要的字段做处理。
具体自己可以写个简单的试试。
分享到:
评论

相关推荐

    java使用fastJson处理复杂Json字符串,直接获取key对应的value值

    java使用fastJson处理复杂Json字符串,直接获取key对应的value值

    fastjson-1.2.83.jar下载

    fastjson-1.2.83.jar下载,fastjson是阿里巴巴的开源JSON解析库,可以解析JSON格式的字符串,支持将Java Bean序列化为JSON字符串,也支持从JSON字符串反序列化到JavaBean。fastjson采用全新的JSON解析算法,运行速度极快...

    Android FastJSON小示例

    在Android Studio中集成FastJSON,你需要在`build.gradle`文件的dependencies部分添加以下依赖: ```groovy dependencies { implementation 'com.alibaba:fastjson:版本号' // 替换为最新版本号 } ``` 同步项目后,...

    fastjson-1.2.58.rar

    在Java项目中引入Fastjson,可以通过Maven或Gradle等构建工具添加依赖,或者直接将解压后的“fastjson-1.2.58.jar”添加到项目的类路径中。使用时,只需通过import语句导入Fastjson的相关类,即可调用其提供的方法...

    FastJson对于JSON格式字符串、JSON对象及JavaBean之间的相互转换操作

    FastJson支持JSON格式字符串、JSON对象(JSONObject)以及JavaBean之间的相互转换,使得数据处理变得简单。以下将详细解释这些转换操作。 1. JSON格式字符串到JSON对象的转换: 使用`JSON.parseObject()`方法可以...

    fastjson的一个小例子

    FastJson是阿里巴巴开源的一款高性能的JSON库,它主要用于Java对象与JSON字符串之间的转换。在这个小例子中,我们将深入探讨FastJson的使用方法,以及它如何帮助开发者在Android开发中快速处理JSON数据。 在Android...

    fastjson工具

    FastJson对于json格式字符串的解析主要用到了下面三个类: 1.JSON:fastJson的解析器,用于JSON格式字符串与JSON对象及javaBean之间的转换 2.JSONObject:fastJson提供的json对象 3.JSONArray:fastJson提供json...

    阿里fastjson.jar

    这个文件通常会被添加到Java项目的类路径中,以便在运行时使用Fastjson的功能。 描述中的"FASTJSON-1.2.17.jar"是Fastjson的一个特定版本——1.2.17。这个版本修复了一些已知问题,提升了性能,并可能引入了新的...

    fastjson-1.2.49

    fastjson是由阿里巴巴提供的,fastJson对于json格式字符串的解析主要用到了一下三个类: JSON:fastJson的解析器,用于JSON格式字符串与JSON对象及javaBean之间的转换。 JSONObject:fastJson提供的json对象。 ...

    阿里json包 fastjson-1.2.3.jar

    FastJson对于json格式字符串的解析主要用到了下面三个类: 1.JSON:fastJson的解析器,用于JSON格式字符串与JSON对象及javaBean之间的转换 2.JSONObject:fastJson提供的json对象 3.JSONArray:fastJson提供json数组...

    Java fastjson解析json字符串实现过程解析

    在开始解析JSON字符串之前,首先需要将Fastjson的依赖添加到项目中。如果你使用的是Maven,可以在pom.xml文件中添加以下依赖: ```xml &lt;groupId&gt;com.alibaba&lt;/groupId&gt; &lt;artifactId&gt;fastjson &lt;version&gt;1.2.67 ...

    FastJsonJar

    通过优化的算法和高效的内存管理,FastJson能够快速地将JSON字符串转化为Java对象,同时也能够将Java对象转化为JSON格式的字符串,这对于频繁进行JSON操作的系统来说,无疑大大提升了效率。 其次,FastJsonJar提供...

    FastJson处理$ref的js类库 FastJson-1.0.min.js

    当项目中使用了fastjson框架转换json字符串后,默认情况下会有$ref这样的引用方式。 如果不使用此引用,在重复嵌套时,可能会耗尽系统资源。 但是如果启用的话,在页面js中又无法正常使用。 现只需要引入此js文件,...

    Alibaba Fastjson Jar包.zip

    在Java程序中,为了使用Fastjson进行JSON操作,我们需要首先将这个JAR包添加到项目的类路径中。一旦完成,就可以通过`import com.alibaba.fastjson.JSON;`和`import com.alibaba.fastjson.JSONArray;`来引入所需的类...

    fastJson依赖jar包

    在实际应用中,开发人员通常会将`fastjson.jar`包添加到项目的类路径中,以便在项目中直接调用其提供的API。例如,将JSON字符串转换为Java对象的代码可能如下: ```java String jsonString = "{\"name\":\"张三\",\...

    fastjson-1.2.78.jar.zip

    1. JSON到Java对象的映射:Fastjson支持将JSON字符串解析为Java对象,例如JSONObject、JSONArray等,同时也支持将Java对象转换成JSON字符串。 2. 数据类型自动适配:Fastjson可以自动识别Java对象的属性类型,并进行...

    fastjson1.2.9.zip

    Fastjson的核心功能在于将Java对象序列化为JSON字符串,同时也能将JSON字符串反序列化为Java对象。这种双向转换机制使得数据的存储和传输变得轻而易举。在Java世界中,JSON作为一种轻量级的数据交换格式,广泛应用于...

    fastjson-1.2.9.jar.zip

    1. **解析 JSON**: Fastjson 提供了简单直观的 API 来解析 JSON 格式的字符串。例如,通过 `JSON.parseObject(String jsonString, Class&lt;T&gt; clazz)` 方法,可以将 JSON 字符串转换为指定类型的 Java 对象。此过程...

    fastjson-1.2.66_fastjson-1.2.66.jar_Fastjson_

    Fastjson 1.2.66是该库的一个稳定版本,其核心功能包括JSON字符串与Java对象之间的转换,以及JSON数据的解析与生成。本文将深入探讨Fastjson 1.2.66版本中的关键特性和使用技巧。 1. **JSON字符串与Java对象的转换*...

    fastJsonDemo

    FastJson是阿里巴巴开发的一款高性能的Java JSON库,它能够快速地进行JSON到Java对象以及Java对象到JSON字符串之间的转换。在Android开发中,由于其轻量级和高效的特性,FastJson常被用于处理服务器返回的JSON数据。...

Global site tag (gtag.js) - Google Analytics