• 在使用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;
  • 相关阅读:
    1.01与37.8
    CakePHP 2.x CookBook 中文版 第七章 模型 之 检索数据
    CakePHP 2.x CookBook 中文版 第七章 模型
    CakePHP 2.x CookBook 中文版 第七章 模型 之 数据校验
    CakePHP 2.x CookBook 中文版 第五章 控制器 之 请求和响应对象
    CakePHP 2.x CookBook 中文版 第五章 控制器 之 脚手架
    CakePHP 2.x CookBook 中文版 第七章 模型 之 保存数据
    CakePHP 2.x CookBook 中文版 第三章 入门 之 CakePHP 的结构
    Zend Studio 10 phpFormatter 错误的解决
    CakePHP 2.x CookBook 中文版 第三章 入门 之 CakePHP 的文件夹结构
  • 原文地址:https://www.cnblogs.com/soul-wonder/p/9080403.html
Copyright © 2020-2023  润新知