利用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(List nodes){ TreeBuildertreeBuilder=newTreeBuilder(nodes); returntreeBuilder.buildJSONTree(); } publicTreeBuilder(){ } publicTreeBuilder(List nodes){ super(); this.nodes=nodes; } //构建JSON树形结构 publicStringbuildJSONTree(){ List nodeTree=buildTree(); JSONArrayjsonArray=JSONArray.fromObject(nodeTree); returnjsonArray.toString(); } //构建树形结构 publicList buildTree(){ List treeNodes=newArrayList<>(); List rootNodes=getRootNodes(); for(NoderootNode:rootNodes){ buildChildNodes(rootNode); treeNodes.add(rootNode); } returntreeNodes; } //递归子节点 publicvoidbuildChildNodes(Nodenode){ List children=getChildNodes(node); if(!children.isEmpty()){ for(Nodechild:children){ buildChildNodes(child); } node.setChildren(children); } } //获取父节点下所有的子节点 publicList getChildNodes(Nodepnode){ List childNodes=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; } //获取集合中所有的根节点 publicList getRootNodes(){ List rootNodes=newArrayList<>(); for(Noden:nodes){ if(rootNode(n)){ rootNodes.add(n); } } returnrootNodes; } publicstaticclassNode{ privateStringid; privateStringpid; privateStringname; privateList children; 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; } publicList getChildren(){ returnchildren; } publicvoidsetChildren(List children){ 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();
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对毛票票的支持。