`

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"
}
分享到:
评论

相关推荐

    fastjson-1.2.46.zip

    3. 避免循环引用:在Java对象中避免出现循环引用,否则可能导致内存泄漏。 总结,Fastjson-1.2.46版本在保持易用性的同时,进一步提升了性能,为开发者提供了更稳定、高效的JSON处理工具。在日常开发中,熟练掌握...

    fastjson-1.2.73.jar.zip

    - 针对 JSON 反序列化攻击,Fastjson 添加了安全模式,限制了一些可能导致安全问题的操作,例如 `allowCircle` 参数控制是否允许循环引用。 7. **与其他库的集成** - Fastjson 可以无缝集成到 Spring、MyBatis 等...

    fastjson-1.1.36 源码

    在`test`目录下的测试类中,Fastjson的单元测试覆盖了各种场景,包括基本类型、集合、自定义类型、循环引用等,这些测试用例对于理解Fastjson的工作原理和排查潜在问题非常有帮助。 在性能优化方面,Fastjson ...

    fastjson-1.1.42

    1. 修复parser在处理循环引用在某些特定场景下的bug; 2. 支持在Bean上通过JSONType配置DisableCircularReferenceDetect/BeanToArray特性; 3. 修正在并发序列化时Object类型字段BUG; 4. 新增JSONPObject对jsonp...

    FastJsonJar .zip

    FastJson工具,附带有使用方法 他的优点是: ·高性能·  fastjson采用独创的算法,将parse的速度提升到极致,超过所有json库... 支持循环引用  ·无依赖·  不需要例外额外的jar,能够直接跑在JDK上。

    详解在springmvc中解决FastJson循环引用的问题

    通过这种方式,FastJson会避免在JSON字符串中保留循环引用信息,而是将循环引用的对象序列化为一个简单的表示,如“$ref”标识符,而不是对象的实际内容。 在Spring MVC中,要应用FastJson并禁用循环引用检测,需要...

    解决FastJson中"$ref重复引用"的问题方法

    其次,还提到了循环引用的问题,即两个对象互相引用,这种情况在序列化时可能会导致堆栈溢出错误(StackOverflowError)。 重复引用是指在JSON字符串中,某个对象引用被多次使用,而循环引用则指对象A引用对象B,...

    fastjson的jar包,包含api文档

    支持循环引用 无依赖 不需要例外额外的jar,能够直接跑在JDK上。 支持范围广 支持JDK 5、JDK 6、Android、阿里云手机等环境。 开源 Apache License 2.0 代码托管在github.org上,项目地址是 ...

    fastJSON.docx

    FastJSON 支持循环引用,无需额外的 JAR,可以直接跑在 JDK 上。 FastJSON 支持广泛的环境,包括 JDK 5、JDK 6、Android、阿里云手机等。 FastJSON 是一个开源项目,采用 Apache License 2.0 开源协议,代码托管在...

    fastJSON使用.pdf

    FastJSON 支持循环引用,无依赖,不需要额外的 JAR,能够直接跑在 JDK 上。 FastJSON 支持范围广,支持 JDK 5、JDK 6、Android、阿里云手机等环境。 FastJSON 序列化 FastJSON 序列化一个 JSON 库涉及的最基本...

    fastJSON使用.docx

    FastJSON 支持循环引用,无依赖,不需要额外的 JAR,能够直接跑在 JDK 上。 FastJSON 的支持范围广泛,支持 JDK 5、JDK 6、Android、阿里云手机等环境。FastJSON 采用 Apache License 2.0 开源,代码托管在 GitHub....

    fastJson属性配置说明

    18. **DisableCircularReferenceDetect**:禁用循环引用检测,防止无限递归。 19. **WriteSlashAsSpecial**:处理斜杠转义,如 `\` 会被转为 `\\`。 20. **BrowserCompatible**:使 JSON 输出兼容浏览器解析,如...

    fastJSON.pdf

    * 支持循环引用:FastJSON 支持循环引用,无需额外的 JAR,能够直接跑在 JDK 上。 * 开源:FastJSON 的代码托管在 GitHub 上,开源协议为 Apache License 2.0。 FastJSON 的使用 FastJSON 的使用非常简单,只需要...

    fastjson的jar包以及源码包 绿色版1.2.41

    Fastjson 1.2.41版本针对大量数据处理和循环引用场景做了性能优化,通过源码学习可以了解其优化策略,如对象池的使用、避免反射等。 5. **错误处理** 源码中包含了大量的异常处理逻辑,了解这些逻辑可以帮助...

    fastjson.zip

    例如,可以通过设置`Features.DisableCircularReferenceDetect`关闭循环引用检测,提高解析速度。 五、安全注意事项 尽管Fastjson性能出色,但在某些特定情况下可能会存在安全风险,如JSON反序列化漏洞。因此,...

    Fastjson介绍

    2. **支持循环引用**:即使Java对象之间存在循环引用关系,Fastjson也能正确处理。 3. **支持泛型**:Fastjson在处理泛型时非常灵活,能够轻松处理各种泛型对象的序列化和反序列化。 4. **定制化序列化**:...

    Fastjson介绍.pptx

    此外,Fastjson能够处理循环引用的对象,支持对代理对象(如CGLIB和javassist生成的)的序列化和反序列化。它还能够自动识别多种日期格式,并支持只读的List/Map的反序列化。Stream API使得处理大型对象和JSON文本变...

    SpringBoot整合FastJson过程解析

    例如,`WriteMapNullValue`允许序列化时包含值为null的字段,而`DisableCircularReferenceDetect`则禁用了循环引用检测,以防止无限递归的问题。 通过以上步骤,我们就成功地将SpringBoot与FastJson进行了整合。...

    springboot实现FastJson解析json数据的方法

    FastJson支持泛型、支持循环引用、支持各种Java集合类型等特性使其在处理JSON数据时显得非常方便。 2. Spring Boot与FastJson集成: 在Spring Boot项目中集成FastJson,首先需要添加FastJson的依赖到项目的pom.xml...

Global site tag (gtag.js) - Google Analytics