在使用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;

 

posted @ 2018-05-23 23:38  灬小乙  阅读(687)  评论(0编辑  收藏  举报