`

重写 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属性详细说明:FastJsonHttpMessageConverter4、AutoCloseSource、AllowComment、AllowUnQuotedFieldNames、AllowSingleQuotes、InternFieldNames等

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

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

    fastjson定制工程,别名配置化

    原生的fastjson 字段别名只能通过代码hardcode , 这里我添加了别名的配置文件读取,这样适合在和第三方对接接口字段名经常变更的情况。

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

    转换器FastJSON

    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

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

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

    fastjson-1.2.54-API文档-中文版.zip

    赠送jar包:fastjson-1.2.54.jar; 赠送原API文档:fastjson-1.2.54-javadoc.jar; 赠送源代码:fastjson-1.2.54-sources.jar; 赠送Maven依赖信息文件:fastjson-1.2.54.pom; 包含翻译后的API文档:fastjson-...

    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小示例,对应博文地址: http://blog.csdn.net/djstavaV/article/details/48785801

    Alibaba Fastjson Jar包

    Alibaba Fastjson Jar包官方版是可以帮助使用Fastjson功能的Fastjson jar包,Fastjson是一个Java语言编写的高性能功能完善的JSON库,当然必备Alibaba Fastjson Jar包官方版。

    fastjson-1.2.72-API文档-中文版.zip

    赠送jar包:fastjson-1.2.72.jar; 赠送原API文档:fastjson-1.2.72-javadoc.jar; 赠送源代码:fastjson-1.2.72-sources.jar; 赠送Maven依赖信息文件:fastjson-1.2.72.pom; 包含翻译后的API文档:fastjson-1.2....

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

    此配置和包,是springMVC4.3.3 +spring4+hibernate5.1.3+二级缓存ehcache(不用可以关闭)+fastjson。 是正常运行的项目里拷出来的,方便大家使用。

    fastjson工具

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

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

    fastJSON 版本 v2.1.18

    阿里fastjson.jar

    FASTJSON-1.2.17.jar,FASTJSON-1.2.17-sources.jar

    fastjson-1.2.78-API文档-中文版.zip

    赠送jar包:fastjson-1.2.78.jar; 赠送原API文档:fastjson-1.2.78-javadoc.jar; 赠送源代码:fastjson-1.2.78-sources.jar; 赠送Maven依赖信息文件:fastjson-1.2.78.pom; 包含翻译后的API文档:fastjson-1.2....

    fastjson.jar包

    Alibaba Fastjson Jar包是可以帮助使用Fastjson功能的Fastjson jar包,Fastjson是一个Java语言编写的高性能功能完善的JSON库,当然必备fastjson jar包。快速解析json神器,方便快捷的工具。

    fastjson1.2.2.rar

    fastjson1.2.2.rar

    fastJSON文档

    fastjson类库相关文档(fastjson文档)

    fastJSON_v2.1.1

    fastjson 是一个性能很好的 Java 语言实现的 JSON 解析器和生成器 来自阿里巴巴的工程师开发 主要特点: 快速FAST 比其它任何基于Java的解析器和生成器更快 包括jackson) 强大(支持普通JDK类包括任意Java Bean ...

Global site tag (gtag.js) - Google Analytics