`

重写 FastJson 属性过滤器(hibernate关连关系)

阅读更多
package cn.topcheer.landTax.filter;
import java.util.HashMap;
import java.util.Map;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.serializer.JSONSerializer;
import com.alibaba.fastjson.serializer.PropertyPreFilter;
import com.alibaba.fastjson.serializer.SerializerFeature;
      
/**
 * @author :晨风²º¹³ <br>
 * @Comment : fastjson 针对类型的属性选择过滤器(可以跨层级) <br>
 */
public class ComplexPropertyPreFilter implements PropertyPreFilter {
          
    private Map<Class<?>, String[]> includes = new HashMap<Class<?>, String[]>();
    private Map<Class<?>, String[]> excludes = new HashMap<Class<?>, String[]>();
          
    static {
        JSON.DEFAULT_GENERATE_FEATURE |= SerializerFeature.DisableCircularReferenceDetect.getMask();
    }
          
    public ComplexPropertyPreFilter() {
              
    }
          
    public ComplexPropertyPreFilter(Map<Class<?>, String[]> includes) {
        super();
        this.includes = includes;
    }
          
    public boolean apply(JSONSerializer serializer, Object source, String name) {
              
        //对象为空。直接放行
        if (source == null) {
            return true;
        }
              
        // 获取当前需要序列化的对象的类对象
        Class<?> clazz = source.getClass();
              
        // 无需序列的对象、寻找需要过滤的对象,可以提高查找层级
        // 找到不需要的序列化的类型
        for (Map.Entry<Class<?>, String[]> item : this.excludes.entrySet()) {
            // isAssignableFrom(),用来判断类型间是否有继承关系
            if (item.getKey().isAssignableFrom(clazz)) {
                String[] strs = item.getValue();
                      
                // 该类型下 此 name 值无需序列化
                if (isHave(strs, name)) {
                    return false;
                }
            }
        }
              
        // 需要序列的对象集合为空 表示 全部需要序列化
        if (this.includes.isEmpty()) {
            return true;
        }
              
        // 需要序列的对象
        // 找到不需要的序列化的类型
        for (Map.Entry<Class<?>, String[]> item : this.includes.entrySet()) {
            // isAssignableFrom(),用来判断类型间是否有继承关系
            if (item.getKey().isAssignableFrom(clazz)) {
                String[] strs = item.getValue();
                // 该类型下 此 name 值无需序列化
                if (isHave(strs, name)) {
                    return true;
                }
            }
        }
              
        return false;
    }
          
    /*
     * 此方法有两个参数,第一个是要查找的字符串数组,第二个是要查找的字符或字符串
     */
    public static boolean isHave(String[] strs, String s) {
              
        for (int i = 0; i < strs.length; i++) {
            // 循环查找字符串数组中的每个字符串中是否包含所有查找的内容
            if (strs[i].equals(s)) {
                // 查找到了就返回真,不在继续查询
                return true;
            }
        }
              
        // 没找到返回false
        return false;
    }
          
    public Map<Class<?>, String[]> getIncludes() {
        return includes;
    }
          
    public void setIncludes(Map<Class<?>, String[]> includes) {
        this.includes = includes;
    }
          
    public Map<Class<?>, String[]> getExcludes() {
        return excludes;
    }
          
    public void setExcludes(Map<Class<?>, String[]> excludes) {
        this.excludes = excludes;
    }
}

 

使用其过滤器

 

Map<Class<?>, String[]> map = new HashMap<Class<?>, String[]>();
map.put(Area.class, new String[]{"id","name","area"});
ComplexPropertyPreFilter ss = new ComplexPropertyPreFilter(map);
String ddd = JSONArray.toJSONString(list,ss);

 

其结果:

[
    {
        "id": "420000",
        "name": "湖北省"
    },
    {
        "area": {
            "id": "420000",
            "name": "湖北省"
        },
        "id": "420051",
        "name": "省直属局"
    },
    {
        "area": {
            "id": "420000",
            "name": "湖北省"
        },
        "id": "420100",
        "name": "武汉市"
    },
    {
        "area": {
            "area": {
                "id": "420000",
                "name": "湖北省"
            },
            "id": "420100",
            "name": "武汉市"
        },
        "id": "420101",
        "name": "武汉市直属"
    },
    {
        "area": {
            "area": {
                "id": "420000",
                "name": "湖北省"
            },
            "id": "420100",
            "name": "武汉市"
        },
        "id": "420102",
        "name": "江岸区"
    }]

 

分享到:
评论

相关推荐

    fastJson属性配置说明

    以下是 FastJson 属性的一些详细说明: 1. **QuoteFieldNames**:默认为 true,这意味着在序列化时,JSON 的键会被包裹在双引号中。如果你希望使用单引号,可以设置为 false,并使用 `UseSingleQuotes`。 2. **...

    FastJson调整实体类中属性输出的顺序,字段为空的时候仍然输出

    FastJson调整实体类中属性输出的顺序,字段为空的时候仍然输出,有时候如果不输出空的字段,导致字段缺失在做判断的时候,获取某个字段就会报错,而对于输出顺序的重要性,就是 如果没有顺序,那么数据,在输出到别的接口的...

    fastjson定制工程,别名配置化

    标题中的“fastjson定制工程,别名配置化”指的是对Fastjson库的扩展,使其能够支持动态配置字段别名,而不是像原生Fastjson那样只能硬编码(hardcode)在代码中。这样的改进对于处理与第三方接口交互时,字段名称...

    springmvc4+spring4+hibernate5.1.3+二级缓存ehcache+fastjson配置

    在IT领域,尤其是在Java Web开发中,`SpringMVC`、`Spring`、`Hibernate`以及`Ehcache`和`Fastjson`是常见的技术组件,它们分别在不同的层面上发挥着关键作用。以下是这些技术的详细介绍: 1. **SpringMVC**: ...

    fastjson 各个 版本 jar

    fastjson-1.1.35.jar ,fastjson-1.1.36.jar ,fastjson-1.1.37.jar ,fastjson-1.1.44.jar ,fastjson-1.2.3.jar,fastjson-1.2.4.jar

    retrofit-converter-fastjson,改造变频器fastjson.zip

    转换器FastJSON

    fastjson.jar包

    - **过滤器**: 可以通过`JSONFilter`实现序列化和反序列化时的数据过滤,对敏感信息进行处理。 - **日期格式化**: 自定义日期格式,如`JSON.toJSONString(obj, SerializerFeature.WriteDateUseDateFormat, new ...

    fastjson1.2.2.jar

    《深入理解Fastjson:阿里巴巴的高效JSON库》 在当今的软件开发中,JSON作为一种轻量级的数据交换格式,被广泛应用于服务器与客户端之间的数据传输。而Fastjson,由阿里巴巴公司开发,是一款性能优秀且易用的Java...

    FastJsonJar

    《FastJsonJar:Java开发中的高效JSON处理库》 FastJsonJar,正如其名,是一个专为Java开发者设计的高效JSON解析和生成工具。在现代Web服务和移动应用开发中,JSON作为数据交换格式,其使用频率之高不言而喻。...

    fastjson-1.0.4jar

    首先,Fastjson作为一个JSON解析器,其核心功能包括JSON字符串到Java对象的解析和Java对象到JSON字符串的序列化。这使得开发者能够轻松地在JSON数据和Java对象之间进行转换,极大地简化了数据处理的过程。例如,通过...

    fastjson的一个小例子

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

    Springboot整合shiro、ehcace、redis、spring data jpa,swagger、fastjson等资源

    springboot完美整合shiro、ehcache、redis、spring data jpa,swagger、fastjson,后续继续补充,适合初中级开发练习掌握框架,代码下载可直接运行,测试已通过

    Android FastJSON小示例

    在Android开发中,数据交换和序列化是常见的需求,FastJSON是阿里巴巴提供的一款高效、功能丰富的JSON库,它被广泛应用于Android Studio项目中。本文将详细介绍如何在Android Studio中使用FastJSON进行JSON解析和...

    fastjson-1.2.66_fastjson-1.2.66.jar_Fastjson_

    - **自定义转换器**:对于复杂的类型转换需求,Fastjson允许用户自定义`SerializerFeature`和`DeserializerFeature`,实现个性化处理。 4. **安全特性** - **SQL注入防护**:Fastjson 1.2.66版加强了对SQL注入的...

    最新fastJSON C#的JSON开发包 v2.1.18

    **FastJSON for C#:深度解析与应用** FastJSON 是一个高效的 JSON 序列化和反序列化库,尤其在C#开发环境中被广泛应用。它以其轻量级、快速和简单的特点,使得处理JSON数据变得极其便捷。在这个最新的版本 v2.1.18...

    Fastjson1.2.47以及之前的所有版本

    **Fastjson:一个高效、强大的Java JSON库** Fastjson是阿里巴巴开发的一个开源项目,它是一个Java语言编写的高性能功能完备的JSON库。Fastjson能够将Java对象转换为JSON字符串,也能将JSON内容转换为对应的Java...

    fastjson1.2.2版本.jar

    FastJSON是阿里巴巴开发的一款高效的Java JSON库,它在处理JSON数据方面表现卓越,因其轻量级、快速且功能丰富的特性而备受青睐。标题中的"fastjson1.2.2版本.jar"指的是FastJSON库的1.2.2版本的Java Archive(JAR)...

    阿里fastjson.jar

    阿里Fastjson是一个高性能的Java JSON库,由阿里巴巴公司开发并维护。它被广泛应用于各种Java项目中,尤其在数据解析和序列化方面表现卓越。Fastjson的命名来源于"Fast Java Object to JSON",即快速地将Java对象...

    fastJson依赖jar包

    快速JSON(Fastjson)是阿里巴巴开发的一个高性能的Java JSON库,它能解析JSON格式的数据,并将其转换为Java对象,反之亦然。Fastjson以其高效、轻量级的特点,在Java开发中广泛应用于数据交换和序列化场景。这个...

    fastjson1.2.2.rar

    **Fastjson 深度解析** Fastjson 是阿里巴巴开源的一款高效、功能强大的 JSON 库,它主要用于 Java 和 Android 平台。在标题“fastjson1.2.2.rar”和描述中,我们可以推断出这是一个关于 Fastjson 版本 1.2.2 的...

Global site tag (gtag.js) - Google Analytics