fastjson-循环引用

很多用户在初次使用fastjson时都遇到了循环引用的问题,这是反映最多的问题,我越来越认识到支持循环引用的必要性。经过测试,加入循环应用的支持对性能的影响很小,小于5%。我决定在1.1.3加入循环应用支持,而且是缺省打开这个特性。

fastjson支持的循环应用是自然的,不需要象jackson那样,需要Annotation设置。fastjson支持的引用,是基于path的,方便javascript解析。

语法
{"$ref":"$"} // 引用根对象
{"$ref":"$"} // 引用根对象
{"$ref":"@"} // 引用自己
{"$ref":".."} // 引用父对象
{"$ref":"../.."} // 引用父对象的父对象
{"$ref":"$.members[0].reportTo"} // 基于路径的引用
测试代码
public void test_ref() throws Exception {
Group admin = new Group("admin");

User jobs = new User("jobs");
User sager = new User("sager");
User sdh5724 = new User("sdh5724");

admin.getMembers().add(jobs);
jobs.getGroups().add(admin);

admin.getMembers().add(sager);
sager.getGroups().add(admin);

admin.getMembers().add(sdh5724);
sdh5724.getGroups().add(admin);

sager.setReportTo(sdh5724);
jobs.setReportTo(sdh5724);

SerializeConfig serializeConfig = new SerializeConfig();
serializeConfig.setAsmEnable(false);
String text = JSON.toJSONString(admin, serializeConfig, SerializerFeature.PrettyFormat);
System.out.println(text);

ParserConfig config = new ParserConfig();
config.setAsmEnable(false);

JSON.parseObject(text, Group.class, config, 0);
}

public static class Group {
private String name;
private List<User> members = new ArrayList<User>();
public Group(){
}
public Group(String name){
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public List<User> getMembers() {
return members;
}
public void setMembers(List<User> members) {
this.members = members;
}
public String toString() {
return this.name;
}
}
public static class User {
private String name;
private List<Group> groups = new ArrayList<Group>();
private User reportTo;
public User(){
}
public User getReportTo() {
return reportTo;
}
public void setReportTo(User reportTo) {
this.reportTo = reportTo;
}
public User(String name){
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public List<Group> getGroups() {
return groups;
}
public void setGroups(List<Group> groups) {
this.groups = groups;
}
public String toString() {
return this.name;
}
}
测试输出结果
{
"members":[
{
"groups":[{"$ref":"$"}],
"name":"jobs",
"reportTo":{
"groups":[{"$ref":"$"}],
"name":"sdh5724"
}
},
{
"groups":[{"$ref":"$"}],
"name":"sager",
"reportTo":{"$ref":"$.members[0].reportTo"}
},
{"$ref":"$.members[0].reportTo"}
],
"name":"admin"
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值