JSON工具学习记录FastJSON循环引用问题
来源:互联网 发布:2017网络搞笑歌曲 编辑:程序博客网 时间:2024/06/08 13:27
JSON工具学习记录FastJSON循环引用问题:最近基于他人项目做二次开发,遇到了循环引用的问题,简单来说A引用了B,B引用了C,C引用了A,那么转换json就会无休止的转换下去。
更复杂的情况,A中引用了B,B中引用了一个A的集合,比如广告引用了广告类型,广告类型里面又有该类型下的所属广告.
1.构造情景
这种又叫做双向引用,个人感觉这种设计本身就不是很合理,当然还要看具体使用场景了.
广告类:
1234567891011121314151617/**
* @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
}
广告实体类:
12345678910111213import
java.util.List;
/**
* @author Niu Li
* @date 2016/8/12
*/
public
class
ADTypeEntity {
private
int
id;
private
String name;
//引用了其广告集合
private
List lists;
//省略get和set
}</adentity>
测试代码:
12345678910111213141516171819202122public
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 lists =
new
ArrayList();
lists.add(entity1);
lists.add(entity2);
lists.add(entity3);
//双向引用
adTypeEntity.setLists(lists);
String result = JSON.toJSONString(entity1);
System.out.println(result);
}
}</adentity></adentity>
结果可以看到双向引用被替换成$ref了:
123456789101112131415161718192021222324252627{
"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
12@JSONField
(serialize =
false
)
private
List lists;</adentity>
得到结果
12345678{
"adTypeEntity"
: {
"id"
:
1
,
"name"
:
"轮播图"
},
"id"
:
1
,
"name"
:
"图1"
}
2.自定义转换字段
12SimplePropertyPreFilter filter =
new
SimplePropertyPreFilter(ADTypeEntity.
class
,
"id"
,
"name"
);
String result = JSON.toJSONString(entity1,filter);
这表明对于ADTypeEntity类只序列化id和name字段,这样的话就排除掉list集合引用了,得到的结果和上面一样.
0 0
- JSON工具学习记录--FastJSON循环引用问题
- JSON工具学习记录FastJSON循环引用问题
- JSON工具学习记录--FastJSON
- FastJson循环引用问题
- FastJson转JSON 引用问题
- 【FastJSON】解决FastJson中“$ref 循环引用”的问题
- 【FastJSON】解决FastJson中“$ref 循环引用”的问题
- 解决fastjson内存对象重复/循环引用json错误
- 解决fastjson循环引用问题(死循环)
- springmvc中解决FastJson循环引用的问题
- 【Java】消除fastjson对同一对象循环引用的问题
- 在springmvc中解决FastJson循环引用的问题
- springmvc中解决FastJson循环引用的问题
- 在springmvc中解决FastJson循环引用的问题
- 在springmvc中解决FastJson循环引用的问题
- 解决FastJson中“$ref 循环引用”的问题
- 解决FastJson的$ref循环引用检测的问题
- Json工具之FastJson
- AVstream英文文章
- FGD(二)
- 第一篇
- ERROR 2003 (HY000): Can't connect to MySQL server on 'localhost' (10061) 解决办法
- list列表计数方法
- JSON工具学习记录FastJSON循环引用问题
- 1018. Public Bike Management (30)
- 关于druid连接池,无法获取连接的问题
- 遇到问题---maven----Unable to process Jar entry
- 抽象类和接口
- nginx日志配置指令详解
- Android 自定义View 实现loading动画
- 成员初始化列表
- 微服务架构之spring cloud (一)分布式配置中心