JSON复杂数据处理之Json树形结构数据转Java对象并存储到数据库的实现
在网站开发中经常遇到级联数据的展示,比如选择城市的时候弹出的省市县选择界面。很多前端制作人员习惯于从JSON中而不是从数据库中获取省市县数据。那么在选择了省市县中的某一个城市,存储到数据库中需要存储所选城市的代码。所以需要一个能将JSON数据(一般存储在javascript脚本中)结构全部导入到数据库中的功能。
JSON的特点是支持层级结构、支持数组表示的对象。下面的示例介绍如何将JSON的省市县数据保存到数据库中,实现原理非常简单,就是利用JSON的java工具包API,将层次结构的JSON对象数组通过递归的方式首选转换为Java对象数组,然后保存到数据库中。
实现步骤是:
(一)首先定义一个JsonItem实体类:
packageorg.openjweb.core.entity; publicclassJsonItem { privateStringsub_id; privateStringsub_name; privateJsonItem[]items; publicJsonItem[]getItems(){ returnitems; } publicvoidsetItems(JsonItem[]items){ this.items=items; } publicStringgetSub_id(){ returnsub_id; } publicvoidsetSub_id(Stringsub_id){ this.sub_id=sub_id; } publicStringgetSub_name(){ returnsub_name; } publicvoidsetSub_name(Stringsub_name){ this.sub_name=sub_name; } }
(二)定义一个工具类,在工具类中读取Json数据文件,并进行递归调用:
publicstaticStringimportJson(StringfullFileName,StringjsonType,Stringencoding,HttpServletRequestrequest)throwsException { //Json转换为实体类参考:http://www.cnblogs.com/hoojo/archive/2011/04/21/2023805.html StringsReturn=""; StringjsonData=""; try { jsonData=FileUtil.getTextFileContent(fullFileName,encoding); } catch(Exceptionex) { sReturn="读Json文件失败!"; } //获取rootId //logger.info(""); jsonData=jsonData.replace("\"items\":\"\"","");//去掉空的items StringparentId=jsonData.substring(jsonData.indexOf("\"id\":")+5); parentId=parentId.substring(0,parentId.indexOf(",")).trim(); parentId=parentId.replace("\"",""); logger.info("rootid=="+parentId); StringparentName=jsonData.substring(jsonData.indexOf("\"name\":")+7); parentName=parentName.substring(0,parentName.indexOf(",")).trim(); parentName=parentName.replace("\"",""); logger.info("rootName=="+parentName); StringrootData=jsonData.substring(jsonData.indexOf("\"items\":")+8,jsonData.lastIndexOf("}")); rootData=jsonData.substring(jsonData.indexOf("[")+1,jsonData.lastIndexOf("]")); //不同json的id,name表示不一样,统一换成sub_id,subname以便与JsonItem的类属性匹配 //替换后方便统一处理 rootData=rootData.replace("city_id","sub_id"); rootData=rootData.replace("sub_city","sub_name"); rootData=rootData.replace("city","sub_name"); rootData=rootData.replace("sub_txt","sub_name"); rootData=rootData.replace("sub_industry","sub_name"); rootData=rootData.replace("industry_id","sub_id"); rootData=rootData.replace("industry","sub_name"); rootData=rootData.replace("sub_profession","sub_name"); rootData=rootData.replace("profession_id","sub_id"); rootData=rootData.replace("profession","sub_name"); //将rootData转换为array rootData="["+rootData+"]"; try { FileUtil.str2file(rootData,"d:/jsonData.txt","utf-8");//存储到磁盘检查字符串转换是否正确 } catch(Exceptionex) { } JSONArrayjsonArray=JSONArray.fromObject(rootData); Object[]os=jsonArray.toArray(); JsonItem[]items=(JsonItem[])JSONArray.toArray(jsonArray,JsonItem.class); saveJsonEnt(jsonType,parentId,parentName,"-1",newLong(1)); dealJson(items,parentId,jsonType,newLong(1)); returnsReturn; } privatestaticvoidsaveJsonEnt(StringjsonType,StringjsonId,StringjsonName,StringparentId,LonglevelId)throwsException { logger.info(jsonType+"/"+jsonId+"/"+jsonName+"/"+parentId+"/"+String.valueOf(levelId)); CommJsonDataent=newCommJsonData(); ent.setJsonType(jsonType); ent.setJsonCode(jsonId); ent.setJsonName(jsonName); ent.setRowId(StringUtil.getUUID()); ent.setParentCode(parentId); ent.setLevelId(levelId); IDBSupportServiceservice=(IDBSupportService)ServiceLocator.getBean("IDBSupportService3"); service.saveOrUpdate(ent); } privatestaticStringdealJson(JsonItem[]jsonItem,StringparentId,StringjsonType,Longlevel) { StringsReturn=""; if(jsonItem!=null&&jsonItem.length>0) { for(inti=0;i<jsonItem.length;i++) { JsonItement=jsonItem[i]; //System.out.println(ent.getSub_id()); //System.out.println(ent.getSub_name()); try { saveJsonEnt(jsonType,ent.getSub_id(),ent.getSub_name(),parentId,level+1); } catch(Exceptionex) { ex.printStackTrace(); } if(ent.getItems()!=null) { //System.out.println("子项数:"+ent.getItems().length); dealJson(ent.getItems(),ent.getSub_id(),jsonType,level+1); } else { //System.out.println("没有子项!"); } } } //此函数 returnsReturn; }
示例数据(部分):
{ "name":"全国", "id":"0000000000", "description":"崇德易城市数据", "modified":"2012年08月", "copyright":"http://www.chongdeyi.com/", "items":[ { "city":"北京市", "city_id":"1001000000", "items":[ { "sub_city":"东城区", "sub_id":"2001001000" }, { "sub_city":"西城区", "sub_id":"2001002000" }, { "sub_city":"朝阳区", "sub_id":"2001006000" }, { "sub_city":"丰台区", "sub_id":"2001007000" }, { "sub_city":"石景山区", "sub_id":"2001008000" }, { "sub_city":"海淀区", "sub_id":"2001009000" }, { "sub_city":"门头沟区", "sub_id":"2001010000" }, { "sub_city":"房山区", "sub_id":"2001011000" }, { "sub_city":"通州区", "sub_id":"2001012000" }, { "sub_city":"顺义区", "sub_id":"2001013000" }, { "sub_city":"昌平区", "sub_id":"2001014000" }, { "sub_city":"大兴区", "sub_id":"2001015000" }, { "sub_city":"怀柔区", "sub_id":"2001016000" }, { "sub_city":"平谷区", "sub_id":"2001017000" }, { "sub_city":"延庆县", "sub_id":"2001018000" }, { "sub_city":"密云县", "sub_id":"2001019000" }] },{ "city":"天津市", "city_id":"1002000000", "items":[ { "sub_city":"和平区", "sub_id":"2002001000" }
以上所述是小编给大家介绍的JSON复杂数据处理之Json树形结构数据转Java对象并存储到数据库的实现