码迷,mamicode.com
首页 > Web开发 > 详细

JSON工具学习记录--FastJSON循环引用问题

时间:2016-08-12 18:26:13      阅读:194      评论:0      收藏:0      [点我收藏+]

标签:

JSON工具学习记录–FastJSON循环引用问题

标签(空格分隔): fastjson


最近基于他人项目做二次开发,遇到了循环引用的问题,简单来说A引用了B,B引用了C,C引用了A,那么转换json就会无休止的转换下去.
更复杂的情况,A中引用了B,B中引用了一个A的集合,比如广告引用了广告类型,广告类型里面又有该类型下的所属广告.

1.构造情景

这种又叫做双向引用,个人感觉这种设计本身就不是很合理,当然还要看具体使用场景了.

广告类:

/**
 * @author Niu Li
 * @date 2016/8/12
 */
public class ADEntity {
    private int id;
    private String name;
    //引用了一个广告实体类
    private ADTypeEntity adTypeEntity;

    public ADEntity(int id, String name, ADTypeEntity adTypeEntity) {
        this.id = id;
        this.name = name;
        this.adTypeEntity = adTypeEntity;
    }
//省略get和set
}

广告实体类:

import java.util.List;

/**
 * @author Niu Li
 * @date 2016/8/12
 */
public class ADTypeEntity {
    private int id;
    private String name;
    //引用了其广告集合
    private List<ADEntity> lists;
    //省略get和set
}

测试代码:

public class TestApp {
    public static void main(String[] args) {
        //构造广告类型
        ADTypeEntity adTypeEntity = new ADTypeEntity();
        adTypeEntity.setId(1);
        adTypeEntity.setName("轮播图");
        //构造广告
        ADEntity entity1 = new ADEntity(1,"图1",adTypeEntity);
        ADEntity entity2 = new ADEntity(2,"图2",adTypeEntity);
        ADEntity entity3 = new ADEntity(3,"图3",adTypeEntity);

        List<ADEntity> lists = new ArrayList<ADEntity>();
        lists.add(entity1);
        lists.add(entity2);
        lists.add(entity3);
        //双向引用
        adTypeEntity.setLists(lists);

        String result = JSON.toJSONString(entity1);
        System.out.println(result);
    }
}

结果可以看到双向引用被替换成$ref了:

{
  "adTypeEntity": {
    "id": 1,
    "lists": [
      {
        "$ref": "$"
      },
      {
        "adTypeEntity": {
          "$ref": "$.adTypeEntity"
        },
        "id": 2,
        "name": "图2"
      },
      {
        "adTypeEntity": {
          "$ref": "$.adTypeEntity"
        },
        "id": 3,
        "name": "图3"
      }
    ],
    "name": "轮播图"
  },
  "id": 1,
  "name": "图1"
}

2.解决办法

两种解决办法就是哪里有循环引用,就过滤掉该字段.

1.过滤的方式可以使用JSONField注解声明该字段不被转换为json

    @JSONField(serialize = false)
    private List<ADEntity> lists;

得到结果

{
  "adTypeEntity": {
    "id": 1,
    "name": "轮播图"
  },
  "id": 1,
  "name": "图1"
}

2.自定义转换字段

 SimplePropertyPreFilter filter = new SimplePropertyPreFilter(ADTypeEntity.class,"id","name");
        String result = JSON.toJSONString(entity1,filter);

这表明对于ADTypeEntity类只序列化id和name字段,这样的话就排除掉list集合引用了,得到的结果和上面一样.

JSON工具学习记录--FastJSON循环引用问题

标签:

原文地址:http://blog.csdn.net/u012706811/article/details/52190847

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!