我们在遇到树形数据结构时,一般都会借助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);
});
}