请珍惜小编劳动成果,该文章为小编原创,转载请注明出处。
背景:
在ligerui中(其他uI可能也大同小异),实现树形表格可以通过父子节点,也可以通过前缀编码生成树去实现,而使用前缀编码生成树时,树形表格需要的json数据是如下类型的:
var TreeDeptData = { Rows : [ { id: '01', name: "企划部", remark: "1989-01-12", children: [ { id: '0101', name: "企划分部一", remark: "企划分部一" }, { id: '0102', name: "企划分部二", remark: "企划分部二", children: [ { id: '010201', name: "企划分部二 A组", remark: "企划分部二 A组" }, { id: '010202', name: "企划分部二 B组", remark: "企划分部二 B组" } ] }, { id: '0103', name: "企划分部三", remark: "企划分部三" } ] }, { id: '02', name: "研发部", remark: "研发部" }, { id: '03', name: "产品部", remark: "产品部" } ] };所以说,我们需要把普通的数据表格需要的json数据转化成这种样式。接下来我将向大家说一下我是怎么实现该功能的。
数据表的要求:
要实现前缀编码生成树,需要在数据表中添加一些字段,必要的字段有:分级码,级别,前缀码,孩子节点个数,兄弟节点个数,下面是一个简单的建表语句,在创建数据表时里边的数据必须包含:
create table gradeDemo( id int IDENTITY, -- id gradeNum varchar(1), --级别 prev varchar(60), --前缀码 gradeCode varchar(60), --分级码 brotherNum varchar(5), --兄弟节点个数 childrenNum varchar(5) --孩子节点个数 );其中分级码是从1-9,兄弟节点个数不包括自己,下面是数据表截图:
级别为1的分级码的前缀码为0,级别为2的分级码的前缀码为他父节点的分级码,后边的类推。
辅助类:
ObjectByJson类,里边有一个方法getListMapByJSONArrayFromJson(),参数为一个json数组,返回值为一个list<map>
import java.util.ArrayList; import java.util.List; import java.util.Map; import net.sf.json.JSONArray; public class ObjectByJson { //参数格式:[{id:'id1',code:'code1',name:'name1'},{id:'id2',code:'code2',name:'name2'}] public List<Map<String, Object>> getListMapByJSONArrayFromJson(String json) { List list = new ArrayList(); JSONArray array = JSONArray.fromObject(json); Map o = null; for (int i = 0; i < array.size(); i++) { o = (Map) array.get(i); list.add(o); } return list; } }
核心代码:
package OpenSrc.Platform.CommonFun.Json; import java.util.ArrayList; import java.util.List; import java.util.Map; /** * 功能 : 将json转换成树形表格需要的json数据 * 内容简介: ** * 创建日期:2014/05/24 * 创建人 :debug_run * 版权所有:FFA团队 */ public class TreeDataByJson { ObjectByJson objectByJson=new ObjectByJson();; String girdJson=""; public TreeDataByJson(){ } /** 功能 : 将json转换成树形表格需要的json数据 * 内容简介: ** * 创建日期:2014/05/24 * 创建人 :<span style="font-family: Arial, Helvetica, sans-serif;">debug_run</span> * @param jsonString * @return */ public String getTreeJsonByJson(String jsonString){ try { getTreeJsonByJson(jsonString,9); } catch (StopMsgException e) { //System.out.println(e); } return girdJson; } /** 功能 : 将json转换成树形表格需要的json数据 * 内容简介: ** * 创建日期:2014/05/24 * 创建人 :<span style="font-family: Arial, Helvetica, sans-serif;">debug_run</span><span style="font-family: Arial, Helvetica, sans-serif;"> </span> * @param jsonStr * @return */ public void getTreeJsonByJson(String jsonString,int gradeNum){ String json=""; List<Map<String, Object>> newList1= new ArrayList<Map<String, Object>>(); //用于存放重新排好的数据(高层次) List<Map<String, Object>> newList2= new ArrayList<Map<String, Object>>(); //用于存放重新排好的数据 String jsonStr=jsonString.substring(8, jsonString.length()-1); //获取jsonArray的那部分,去掉前边的rows:{ List<Map<String, Object>> list =objectByJson.getListMapByJSONArrayFromJson(jsonStr); //得到一个listMap List removeList=new ArrayList(); //用来保存需要删除的数据的下标 for(int i=0;i<list.size();i++){ Map<String, Object> map=list.get(i); //当前的map if(Integer.parseInt(map.get("gradeNum").toString())==gradeNum){ //低层 newList1.add(map); removeList.add(i); } if(Integer.parseInt(map.get("gradeNum").toString())==(gradeNum-1)&&!map.get("childrenNum").equals("0")){ //高层且有孩子 newList2.add(map); removeList.add(i); } }//for if(newList2.size()==0||newList1.size()==0){ if(gradeNum==2){ girdJson=jsonString; throw new StopMsgException(); //强制退出 } getTreeJsonByJson(jsonString,(gradeNum-1)); } for(int i=0;i<removeList.size();i++){ //从list中删除应该被删除的数据 int j=(Integer) removeList.get(i); j=j-i; //每删除一个,其他的数据的下表前移 list.remove(j); } System.out.println(list.size()); for(int j=0;j<newList2.size();j++){ //遍历所有高层的数据 String gradeCode=newList2.get(j).get("gradeCode").toString(); //高层的分级码 String children="children:["; for(int k=0;k<newList1.size();k++){ //遍历所有低层的数据 String prev=newList1.get(k).get("prev").toString(); if(prev.equals(gradeCode)){ //低层次的前缀码等于于高层次的分级码 children+=newList1.get(k)+","; } } if(!children.equals("children:[")){ children=children.substring(0,children.length()-1); } children+="]}"; String oldData=newList2.get(j).toString(); //旧的数据 String newData="["+oldData.substring(0,oldData.length()-1)+","+children+"]"; //加上孩子后的数据,写成json数组的格式 Map<String, Object> newMap=objectByJson.getListMapByJSONArrayFromJson(newData).get(0); //把合并的数据转成map newList2.set(j,newMap); //重新加入到高层次的list里 // } }//for for(int i=0;i<newList2.size();i++){ //将合并后的两个list---newList2转成json{},{},{} json+=newList2.get(i)+","; } json=json.substring(0,json.length()-1); //去掉最后的逗号 String newJson=""; for(int i=0;i<list.size();i++){ //将list剩余的值再转成json, newJson+=list.get(i)+","; } newJson="{"Rows":["+newJson+json+"]}"; //获取新的json串 if(gradeNum>2){ //若girdJson改变,就要退出递归 getTreeJsonByJson(newJson,(gradeNum-1)); } if(girdJson==""){ girdJson=newJson; System.out.println(girdJson); throw new StopMsgException(); //强制退出递归 } } static class StopMsgException extends RuntimeException { } }
测试:
由于这个涉及到的东西太多,这里就简单测试一下,测试数据是一个json字符串,想必大家都知道怎么获取该json,这里就是不多说了,数据如下:
{ "Rows": [ { "id": 1, "brotherNum": "1", "childrenNum": "1", "gradeNum": "1", "gradeCode": "001", "prev": "0" }, { "id": 3, "brotherNum": "0", "childrenNum": "2", "gradeNum": "2", "gradeCode": "00101", "prev": "001" }, { "id": 4, "brotherNum": "1", "childrenNum": "0", "gradeNum": "3", "gradeCode": "0010101", "prev": "00101" }, { "id": 5, "brotherNum": "1", "childrenNum": "0", "gradeNum": "3", "gradeCode": "0010102", "prev": "00101" }, { "id": 2, "brotherNum": "1", "childrenNum": "0", "gradeNum": "1", "gradeCode": "002", "prev": "0" } ] }
JSONObject jobj,设jobj的值为上述数据,通过调用getTreeJsonByJson()方法:String json=jsonOP.getTreeJsonByJson(jobj.toString());得到的json数据格式如下:
{ "Rows": [ { "id": 2, "brotherNum": "1", "childrenNum": "0", "gradeNum": "1", "gradeCode": "002", "prev": "0" }, { "id": 1, "brotherNum": "1", "childrenNum": "1", "gradeNum": "1", "gradeCode": "001", "prev": "0", "children": [ { "id": 3, "brotherNum": "0", "childrenNum": "2", "gradeNum": "2", "gradeCode": "00101", "prev": "001", "children": [ { "id": 4, "brotherNum": "1", "childrenNum": "0", "gradeNum": "3", "gradeCode": "0010101", "prev": "00101" }, { "id": 5, "brotherNum": "1", "childrenNum": "0", "gradeNum": "3", "gradeCode": "0010102", "prev": "00101" } ] } ] } ] }
需要强调的是,调用该方法时,参数的格式必须和我测试数据的格式是一样的{“Rows”:[ { },{ },{ } ] }
总结:
这篇文章只是简单的说了一下怎么将从数据库里获取的数据转化成树形表格需要的格式,也就是查询部分,关于怎样给这棵树添加节点,自动生成这些分级码,前缀码等信息,也是个难点,以后有时间会写一篇文章专门说一下。
版权声明:本文为博主原创文章,未经博主允许不得转载。