@JsonInclude(JsonInclude.Include.NON_EMPTY)注解用法详解,@JsonInclude、@JsonIgnore两者的区别和递归查找数据的详解

该注解可用于前端树形/层级数据的展示时,最后一层的数据点开以后为空的问题

这么说可能有点抽象,那么直接上图!

在这里三级部门后面是没有部门的。按说后面的层级应该不显示才对,可是三级部门后面还有一个 > ,点开以后确实红色框框这样什么都没有是空白的。

正常来说不应该再显示 >了,那么就不能展开,这才是正常的逻辑。那么该如何解决呢,答案就是:使用@JsonInclude(JsonInclude.Include.NON_EMPTY)

 

public class CategoryEntity implements Serializable {
	private static final long serialVersionUID = 1L;

	/**
	 * id
	 */
	@TableId
	private Long id;
	/**
	 * 名称
	 */
	private String name;
	/**
	 * 父分类 id
	 */
	private Long parentId;
	/**
	 * 层级
	 */
	private Integer catLevel;
	/**
	 * 0 不显示,1 显示]
	 */
	@TableLogic
	private Integer isShow;
	/**
	 * 排序
	 */
	private Integer sort;
	/**
	 * 图标
	 */
	private String icon;
	/**
	 * 统计单位
	 */
	private String proUnit;
	/**
	 * 商品数量
	 */
	private Integer proCount;

    /**
	 * 1. childrenCategories 表示某个分类的子分类集合
	 * 2. @TableField(exist = false) 表示 childrenCategories 不对应表的字段
     */
	/**
	 * 1. @JsonInclude(JsonInclude.Include.NON_EMPTY)
	 * 表示如果 childrenCategories 的值是空数组,就不返回
	 */
    @TableField(exist = false)
	@JsonInclude(JsonInclude.Include.NON_EMPTY)
	private List<CategoryEntity> childrenCategories;

}

在实体类的这个字段childrenCategories上加上注解@JsonInclude(JsonInclude.Include.NON_EMPTY) 问题就解决了。

该注解的作用就是:如果 childrenCategories 的值是空数组,就不返回 

来看下加上注解后的效果吧:

仔细观察此时三级部门后面是没有 > 箭头的,此时问题就解决了。

那么还有一个注解 @JsonIgnore它和@JsonInclude有什么区别呢。

其实也很简单,前者是该字段的值为空则不返回字段给前端,前端都拿不到该字段自然也不会有数据;

后者是该字段可能为一个递归的数据,也就是说,本身字段是有数据的,但字段里面的数据所包含的数据可能为空

递归数据也就是List<CategoryEntity>,该字段的list集合中存放了0或多个对象,所以在层级数据的最后一层后面没有层级数据的时候就要使用@JsonInclude注解不给前端返回。

 

下面是查找递归数据: 

public List<CategoryEntity> listTree() {
        // 所有的层级(分类)信息 
        List<CategoryEntity> entities = baseMapper.selectList(null);
        List<CategoryEntity> categoryTree = entities.stream().filter(categoryEntity -> {
            // 选出第一级分类信息
            return categoryEntity.getParentId() == 0;
        }).map(category -> {
            // 找出一级分类下面的子分类信息
            category.setChildrenCategories(getChildrenCategories(category, entities));
            return category;
        }).sorted((category1, category2) -> {
            // 根据sort值排序
            return (category1.getSort() == null ? 0 : category1.getSort()) -
                    (category2.getSort() == null ? 0 : category2.getSort());
        }).collect(Collectors.toList());
        return categoryTree;
    }

 

/**
     * 递归查找所有分类的分类
     * @param root 根信息
     * @param all 所有层级(分类)信息
     * @return
     */
    private List<CategoryEntity> getChildrenCategories
    (CategoryEntity root, List<CategoryEntity> all) {
        List<CategoryEntity> children = all.stream().filter(categoryEntity -> {
            return categoryEntity.getParentId() == root.getId();
        }).map(categoryEntity -> {
            //1、找到子菜单(分类)信息, 并设置  这里是递归操作,表示查出所有子分类下面的分类信息,如果子分类下面的信息还有分类也要找出。 递归操作如果第一次接触可能理解稍难,多看看就好了!
            categoryEntity.setChildrenCategories(getChildrenCategories(categoryEntity, all));
            return categoryEntity;
        }).sorted((category1, category2) -> {
            return (category1.getSort() == null ? 0 : category1.getSort()) -
                    (category2.getSort() == null ? 0 : category2.getSort());
        }).collect(Collectors.toList());
        return children;
    }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值