使用JsonNode处理树形数据结构问题

我们在遇到树形数据结构时,一般都会借助JsonNode提供的api来对树形数据结构进行解析处理.此处介绍一个简单的例子,案例是实现拖动排序目录结构的功能.

1.请求体如下所示:

@Data
public class TreeNode implements Serializable {
    private Long id;

    private String categoryName;

    private Integer sort;

    private Long parentId;

    private Integer categoryType;

    private List<TreeNode> childList;

}

class TreeNodeCtg implements Serializable {
    private List<TreeNode> treeNodeList;

}

2.主体功能函数

   /**
     * 排序
     * @param request
     * @return
     */
    @Override
    public Boolean sort(TreeNodeCtg request, UserData userData) {
        try {
            if (CollectionUtils.isEmpty(request.getCategoryData())) {
                return Boolean.TRUE;
            }
            List<TreeNode > ctgTreeList = new ArrayList<>();
            // 将树形结构转换成一维结构进行更新
            ObjectMapper mapper = new ObjectMapper();
            JsonNode jsonNode = mapper.valueToTree(request.getTreeNodeList());
            getCtgData(mapper,jsonNode, ctgTreeList, BaseConstant.DIGIT_LONG_ZERO);
            if (CollectionUtils.isEmpty(ctgTreeList)) {
                return Boolean.TRUE;
            }
            AtomicInteger index = new AtomicInteger();
            List<TreeNode > treeNodeList = ctgTreeList.stream()
                    .map(p->new TreeNode(p.getId(), index.incrementAndGet(), p.getParentId()))
                    .collect(Collectors.toList());
            if (!CollectionUtils.isEmpty(treeNodeList)) {
                categoryMapper.batchUpdateSortAndPid(treeNodeList);
            }
            return Boolean.TRUE;
        } catch (Exception e) {
            throw new CheckedException(ExceptionCodeEnum.BD_UPDATE_EXPT);
        }
    }

3.解析树形结构

   /**
     * @desc 解析树
     */
    private void getCtgData(ObjectMapper jackSon, JsonNode jsonNode, List<TreeNode> treeNodeList,
                                Long parentId) {
        try {
            if (jsonNode.isArray()) {
                for (JsonNode node : jsonNode) {
                    TreeNode treeNode= jackSon.readValue(node.toString(), TreeNode.class);
                    treeNode.setParentId(parentId);
                    treeNodeList.add(itemCtg);
                    getSubNode(jackSon, node, treeNodeList, treeNode.getId());
                }
            } else if (jsonNode.isObject()) {
                getSubNode(jackSon, jsonNode, treeNodeList, parentId);
            }
        } catch (Exception e) {
            LOGGER.info("getCtgData exception info :{}", e.getMessage());
        }
    }

4.解析子节点

private void getSubNode(ObjectMapper jackSon, JsonNode jsonNode, List<TreeNode> treeNodeList,
                            Long parentId) {
        Iterator<Map.Entry<String, JsonNode>> fields = jsonNode.fields();
        fields.forEachRemaining(p -> {
            getCtgData(jackSon, p.getValue(), treeNodeList, parentId);
        });
    }
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

叶枫^_^

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值