利用java+mysql递归实现拼接树形JSON列表的方法示例
前言
本文给大家介绍的是关于利用java+mysql递归实现拼接树形JSON列表的相关内容,分享出来供大家参考学习,话不多说,来一起看看详细的介绍:
我们在做Javaweb项目时,前端控件例如国家-省-市-区-县等树形列表,常常需要多级树形json数据
例如:
[
{
"name":"商品目录",
"pid":"-1",
"id":"1",
"children":[
{
"name":"日用品",
"pid":"1",
"id":"11",
"children":[
{
"name":"洗发水",
"pid":"11",
"id":"111",
"children":[
{
"name":"霸王",
"pid":"111",
"id":"1111",
"children":[]
}
]
}
]
},
{
"name":"食品",
"pid":"1",
"id":"12",
"children":[]
}
]
}
]
整体思路分为两步,第一步获取目录及其所有子目录,获取后的列表形式如下:
[
{"id":"1","pid":"-1","name":"商品目录"},
{"id":"11","pid":"1","name":"日用品"},
{"id":"12","pid":"1","name":"食品"},
{"id":"111","pid":"11","name":"洗发水"},
{"id":"1111","pid":"111","name":"霸王"}
]
第二步,利用递归思想拼装该数据,拼装方法的工具类如下:
package*.*.*;
importnet.sf.json.JSONArray;
importjava.util.ArrayList;
importjava.util.List;
/**
*构造目录JSON树
*Createdbyfukangon2017/5/260026.
*/
publicclassTreeBuilder{
Listnodes=newArrayList<>();
publicStringbuildTree(Listnodes){
TreeBuildertreeBuilder=newTreeBuilder(nodes);
returntreeBuilder.buildJSONTree();
}
publicTreeBuilder(){
}
publicTreeBuilder(Listnodes){
super();
this.nodes=nodes;
}
//构建JSON树形结构
publicStringbuildJSONTree(){
ListnodeTree=buildTree();
JSONArrayjsonArray=JSONArray.fromObject(nodeTree);
returnjsonArray.toString();
}
//构建树形结构
publicListbuildTree(){
ListtreeNodes=newArrayList<>();
ListrootNodes=getRootNodes();
for(NoderootNode:rootNodes){
buildChildNodes(rootNode);
treeNodes.add(rootNode);
}
returntreeNodes;
}
//递归子节点
publicvoidbuildChildNodes(Nodenode){
Listchildren=getChildNodes(node);
if(!children.isEmpty()){
for(Nodechild:children){
buildChildNodes(child);
}
node.setChildren(children);
}
}
//获取父节点下所有的子节点
publicListgetChildNodes(Nodepnode){
ListchildNodes=newArrayList<>();
for(Noden:nodes){
if(pnode.getId().equals(n.getPid())){
childNodes.add(n);
}
}
returnchildNodes;
}
//判断是否为根节点
publicbooleanrootNode(Nodenode){
booleanisRootNode=true;
for(Noden:nodes){
if(node.getPid().equals(n.getId())){
isRootNode=false;
break;
}
}
returnisRootNode;
}
//获取集合中所有的根节点
publicListgetRootNodes(){
ListrootNodes=newArrayList<>();
for(Noden:nodes){
if(rootNode(n)){
rootNodes.add(n);
}
}
returnrootNodes;
}
publicstaticclassNode{
privateStringid;
privateStringpid;
privateStringname;
privateListchildren;
publicNode(){
}
publicNode(Stringid,Stringpid,Stringname){
super();
this.id=id;
this.pid=pid;
this.name=name;
}
publicStringgetId(){
returnid;
}
publicvoidsetId(Stringid){
this.id=id;
}
publicStringgetPid(){
returnpid;
}
publicvoidsetPid(Stringpid){
this.pid=pid;
}
publicStringgetName(){
returnname;
}
publicvoidsetName(Stringname){
this.name=name;
}
publicListgetChildren(){
returnchildren;
}
publicvoidsetChildren(Listchildren){
this.children=children;
}
}
}
在Controller中的调用方法是:
@RequestMapping("/bulidJsonTree")
@ResponseBody
publicStringbuildJsonTree(HttpServletRequestrequest){
//获取全部目录节点
Listnodes=iGoodsDirSvc.getAllDirList();
//拼装树形json字符串
Stringjson=newTreeBuilder().buildTree(nodes);
returnjson;
}
其中iGoodsDirSvc.getAllDirList()方法需要将取到的数据转为Node类型:
Stringhql="selectidasid,pIdaspid,nameasnamefromDirectory"; Queryquery=factory.getCurrentSession().createQuery(hql) .setResultTransformer(Transformers.aliasToBean(TreeBuilder.Node.class)); returnquery.list();
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对毛票票的支持。