• 在使用FastJson开发遇到的的坑


    1.list中放入同一个对象,会出现内存地址引用{"$ref":"#[0]"},后台可以识别,但是前台不会识别

    @Test
        public void testList(){
            
            User user = new User();
            user.setUserName("cgx");
            user.setPassword("123456");
            
            User user1 = new User();
            user1.setUserName("zbz");
            user1.setPassword("123456");
            
            ArrayList list = new ArrayList();
            list.add(user);
            list.add(user1);
            list.add(user);
            
            String jsonString = JSON.toJSONString(list,SerializerFeature.DisableCircularReferenceDetect);//关闭循环引用
            System.out.println(jsonString);
        }
    JSON.toJSONString(list,true),会格式化json,方便查看

    2.对象相互包含

    @Test
        public void testList1(){
            
            User user = new User();
            user.setUserName("cgx");
            user.setPassword("123456");
            
            
            HashSet<Role> roles = new HashSet<Role>();
            HashSet<User> users = new HashSet<User>();
            users.add(user);
            
            
            Role role = new Role();
            role.setName("测试角色");
            role.setUsers(users);
            roles.add(role);
            
            user.setRoles(roles);
            
            //两种办法防止循环引用
            //1.在bean的属性上直接@JSONField(serialize=false)去掉不需要转换的属性
            
            //2.
            
            // 遇到sid和sname属性正常进行转换json
            SimplePropertyPreFilter filter = new SimplePropertyPreFilter("password","roles","name");
            
            
            String jsonString = JSON.toJSONString(user,filter,SerializerFeature.DisableCircularReferenceDetect);
            System.out.println(jsonString);
        }

      在实体类中使用@JSONField(serialize=false),是不是此字段就不返回了,放弃转换该字段

      filter进行过滤,想要现实的字段,进行转换的字段,写在过滤中,其他不进行转换

    三、案例

    Page<Inventory> page = inventoryService.getInventoryList(pageNum, size, sortName, sortType, productId, dueDate, creator,
                    status);
            String jsonString = JSON.toJSONString(page,SerializerFeature.DisableCircularReferenceDetect);//关闭集合循环引用
            
            return JSON.parseObject(jsonString);

    1.page为jpa分页返回的page,其中有list,如果直接返回,就会出现内存地址引用{"$ref":"#[0]"},前台不会识别,所以使用SerializerFeature.DisableCircularReferenceDetect来关闭循环引用;

    2.Inventory库存对象中:

    @OneToOne(mappedBy = "inventory", cascade = CascadeType.ALL, fetch = FetchType.LAZY)
        private GcOrder gcConsume;

    GcOrder自营消费关联类:

    @OneToOne(fetch = FetchType.LAZY)
        @JoinColumn(name = "InventoryId")
        private Inventory inventory;

    库存与订单消费一对一双向关联,会出现栈溢出java.lang.StackOverflowError报错,究其原因是----自关联进入了死循环,解决办法是在Inventory对象的gcConsume属性上使用@JSONField(serialize = false),使其不进行序列化。

    /**
         * 自营消费记录-关联
         */
        @JSONField(serialize = false)
        @OneToOne(mappedBy = "inventory", cascade = CascadeType.ALL, fetch = FetchType.LAZY)
        private GcOrder gcConsume;
  • 相关阅读:
    前端十万个为什么(之一):我们为什么需要npm?
    初识模块化开发工具:
    javascript 中的 let 作用域
    把汉字转换为html实体编码
    【小程序】开发过程问题整理
    【入门】正则表达式
    【CSS】面试知识整理
    【入门】Gulp 简单使用
    【入门】WebSocket 示例
    【JQ】$.ajax() 参数
  • 原文地址:https://www.cnblogs.com/soul-wonder/p/9080403.html
Copyright © 2020-2023  润新知