【fastJSON】利用fastJSON处理循环引用的问题

下载fastJSON jar   com.alibaba.fastjson

 

第一种:【写死的】

将需要序列化的字段传递进去,得到结果

//需要序列化的实体+字段
        SimplePropertyPreFilter filter = new SimplePropertyPreFilter(Member.class,"字段1","字段2","可变字符串数组" );
        String result = JSON.toJSONString(Member.class, filter);

 

第二种:【可以复用灵活】

Map保存类对象+此对象所有的字段

传进来需要阻隔的字段

 

 

package net.shopxx.ws.utils;

import java.lang.reflect.Field;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;
import com.alibaba.fastjson.serializer.PropertyFilter;

public class JSONExUtils implements PropertyFilter {

    //需要处理序列化阻隔的实体+实体所有的字段
    private Map<Class<?>, String[]> excludes = new HashMap<Class<?>, String[]>();

    /**
     * apply 方法 返回true表示需要序列化
     * 参数2  不需要序列化的字段【属性】
     * 参数3  实体
     */
    @Override
    public boolean apply(Object object, String paramerter, Object entity) {
        //对象为NULL 直接放行
        if(entity == null){
             return true;
        }

        //获取需要序列化的 类对象
        Class<?> clazz = entity.getClass();

        //查找不需要序列化的字段
        for (Map.Entry<Class<?>, String[]> exItem : this.excludes.entrySet()) {
            // isAssignableFrom()  用来判断类型间是否有继承关系
            if(exItem.getKey().isAssignableFrom(clazz)){
                //不需要序列化的字段包含在所有字段中 下标>1   返回false
                return -1 != Arrays.binarySearch(exItem.getValue(), paramerter);
            }
        }
        return true;
    }

    public void setExcludes(Class<?> cls, String...properties) {
        excludes.put(cls, properties);
    }

    public Map<Class<?>, String[]> getExcludes() {
        return excludes;
    }

    public void setExcludes(Map<Class<?>, String[]> excludes) {
        this.excludes = excludes;
    }

    //获取本对象所有的属性  暂时没用
    public String[] just4Paramerters(Class<?> object){
        Field[] fields = object.getDeclaredFields();
        StringBuffer buffer = new StringBuffer();
        for (Field field : fields) {
            buffer.append(field.getName()+",");
        }
        if(buffer.length() > 0){
            String[] paramerters = buffer.toString().split(",");
            return paramerters;
        }
        return null;
    }

}

 

 

然后在需要使用的地方 调用即可!!

public void testName(){
        JSONExUtils exUtils = new JSONExUtils();
        exUtils.setExcludes(Member.class, new String[]{"需要阻隔的字段"});
        String result = JSON.toJSONString("", exUtils);
    }

 

时间: 2024-09-24 19:18:25

【fastJSON】利用fastJSON处理循环引用的问题的相关文章

Samples DataBind FastJson循环引用问题

  Fastjson full support databind, it's simple to use. Encode import com.alibaba.fastjson.JSON; Group group = new Group(); group.setId(0L); group.setName("admin"); User guestUser = new User(); guestUser.setId(2L); guestUser.setName("guest&qu

【JSON 注解】JSON循环引用1-----Jackson常用注解介绍 eq:@JsonIgnore

循环引用:实体A与实体B有关系,A中有B作为字段,B中有A作为一个字段.查询A对象后,将A对象转化为JSON格式数据时,会因为序列化过程中导致A中有B字段,B字段中又有A,这样就引起了循环引用的问题!! 即如下的解释: 如果A对象持有B的引用,B对象持有A的引用,这样就形成了循环引用,如果直接使用json-lib转换,会报错: net.sf.json.JSONException: There is a cycle in the hierarchy!   错误由来: maven搭建的项目 使用sp

iOS - NSTimer循环引用的解决办法

发生场景 在 Controller B 中有一个 NSTimer @property (strong, nonatomic) NSTimer *timer;  你创建了它,并挂载到 main runloop self.timer = [NSTimer scheduledTimerWithTimeInterval:1   target:self selector:@selector(timerAction:) userInfo:nil repeats:true];  然后退出 Controller

onetomany-Hibernate中@ManyToOne与@OneToMany注解查询结果用gson序列化出现循环引用问题

问题描述 Hibernate中@ManyToOne与@OneToMany注解查询结果用gson序列化出现循环引用问题 首先,我确定我遇到的问题在baidu没有找到解决方案. 现有2个表Customer,Account两个表,他们之间是一对多的关系 , 一个客户有多个账户.定义2个实体类如下: public class Customer implements Serializable{ private String custId; ....... private Set<Account> acc

Linq查询中类型的转化以及序列化XXX对象时检测到循环引用

  我有一个Studen类型,有5个字段,num,name,birth,idcard,classId,我们一般写Linq查询的时候就是这样写 List<Student> stus =  from Student s in dc.Student select s;   那么其实我只想用其中的两个字段num,name,我就需要写一个dto StudentDto: num,name List<Student> stus =  from Student s in dc.Student   

Hibernate中@ManyToOne与@OneToMany注解查询结果用gson序列化出现循环引用问题

问题描述 首先,我确定我遇到的问题在baidu没有找到解决方案.现有2个表Customer,Account两个表,他们之间是一对多的关系,一个客户有多个账户.定义2个实体类如下:publicclassCustomerimplementsSerializable{privateStringcustId;.......privateSet<Account>accounts=newHashSet<Account>(0);@OneToMany(cascade==CascadeType.AL

JavaScript中的内存泄露模式:在JavaScript应用程序中处理循环引用

如果您知道内存泄漏的起因,那么在 JavaScript 中进行相应的防范就应该相当容易.在这篇文章中,作者 Kiran Sundar 和 Abhijeet Bhattacharya 将带您亲历 JavaScript 中的循环引用的全部基本知识,向您介绍为何它们会在某些浏览器中产生问题,尤其是在结合了闭包的情况下.在了解了您应该引起注意的常见内存泄漏模式之后,您还将学到应对这些泄漏的诸多方法. JavaScript 是用来向 Web 页面添加动态内容的一种功能强大的脚本语言.它尤其特别有助于一些日

Unity Application Block 1.0系列(6):杜绝循环引用

在介绍 Constructor Injection.Property Injection和 Method Call Injection时,都有特别提到不要出现循环引用(Circular References),因为出现这种问题后很难去检测到.最好的解决方法是写代码时候尽量避免出现这种情况. 下面看看循环引用的几个场景,在使用依赖注入框架时应该尽量避免出现这样的情况: 1.通过Constructor Injection生成的对象在构造器的参数中互相引用 public class Class1{ p

Excel中循环引用的用法

  Excel中循环引用的用法          提到循环引用,恐怕很多同学都不会陌生,而且会敬而远之.在Excel中输入公式时,经常会遇到下面的提示框,这就是因为公式中有循环引用的问题导致的. 通常情况下,如果公式中包含对其他单元格或者运算结果的引用,无论是直接还是间接,都不能包含对自身取值的引用.

Excel总是弹出循环引用警告怎么办?

  很多人在打开Excel的时候会频繁弹出"循环引用警告"这是怎么回事?是什么原因造成的?如何阻止弹出呢?请看下面的解决办法. Excel总是弹出循环引用警告怎么办?如何解决 原因:公式引用的对象,直接或间接地引用了当前单元格本身.所以给出错误提醒. 循环引用是指在excel公式中自已直接或间接的引用自已,如下面的公式 C10 =SUM(C6:C10) 'c10中设置的求和公共包括它本身 当表格中含有循环引用时,每次打开表格都会出现提示,如下图所示. 如何能快速找到循环引用的公式地址呢