在实际开发中可能会遇到树状JSON的场景,比如省市县区这类的组织机构,数据库存在一般都是关联关系,如果递归查询性能一般会比较慢,可以考虑将查询出的数据在内存中进行转换,也不失为一种方法。
package com.xxx.xxx.elearning.util;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.muyuan.platform.elearning.entity.TreeNode;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import java.util.ArrayList;
import java.util.List;
/**
* @ClassName JsonUtils
* @Description
* @Author Vincente
* @Date 2020/6/5 9:41
**/
@Slf4j
public class JsonUtils {
/**
* 获取单个对象
*
* @param meta
* @return
*/
public static <T> T getPage(String meta, Class<T> clazz) {
if (StringUtils.isEmpty(meta)) {
return null;
}
return JSONObject.parseObject(meta, clazz);
}
/**
* 获取List集合
*
* @param data
* @return
*/
public static <T> List<T> getDataVOList(String data, Class<T> clazz) {
if (StringUtils.isEmpty(data)) {
return null;
}
return JSONArray.parseArray(data, clazz);
}
/**
* 普通json转为树状json
*
* @param array
* @param id
* @param pid 父ID
* @param child 子节点名称
* @return
*/
public static String toJsonTree(JSONArray array, String id, String pid, String child) {
JSONArray arr = new JSONArray();
JSONObject obj = new JSONObject();
for (int i = 0; i < array.size(); i++) {
JSONObject json = (JSONObject) array.get(i);
obj.put(json.getString(id), json);
}
//遍历结果集
for (int j = 0; j < array.size(); j++) {
JSONObject jsonObject = (JSONObject) array.get(j);
JSONObject jObj = (JSONObject) obj.get(jsonObject.get(pid).toString());
if (jObj != null) {
if (jObj.get(child) != null) {
JSONArray r = (JSONArray) jObj.get(child);
r.add(jsonObject);
jObj.put(child, r);
} else {
JSONArray ch = new JSONArray();
ch.add(jsonObject);
jObj.put(child, ch);
}
} else {
arr.add(jsonObject);
}
}
return JSONObject.toJSONString(arr);
}
/**
* 根据父节点获取所有子节点
* add by Vincente
*
* @param pid
* @param nodeList
* @return
*/
public static List<TreeNode> getChildren(String pid, List<TreeNode> nodeList) {
List<TreeNode> resultList = new ArrayList<>();
if (null != nodeList && nodeList.size() > 0) {
try {
for (TreeNode node : nodeList) {
if (pid.equals(node.getParentid())) {
if (!node.getId().equals("17169")) {
List<TreeNode> children = getChildren(node.getId(), nodeList);
if (children.size() == 0) {
node.setLeaf(true);
}
resultList.add(node);
}
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
return resultList;
}
}