JSON复杂数据处理之Json树形结构数据转Java对象并存储到数据库的实现
程序员文章站
2024-03-08 22:49:10
在网站开发中经常遇到级联数据的展示,比如选择城市的时候弹出的省市县选择界面。很多前端制作人员习惯于从json中而不是从数据库中获取省市县数据。那么在选择了省市县...
在网站开发中经常遇到级联数据的展示,比如选择城市的时候弹出的省市县选择界面。很多前端制作人员习惯于从json中而不是从数据库中获取省市县数据。那么在选择了省市县中的某一个城市 ,存储到数据库中需要存储所选城市的代码。所以需要一个能将json数据(一般存储在javascript脚本中)结构全部导入到数据库中的功能。
json的特点是支持层级结构、支持数组表示的对象 。下面的示例介绍如何将json的省市县数据保存到数据库中,实现原理非常简单,就是利用json的java工具包api,将层次结构的json对象数组通过递归的方式首选转换为java对象数组,然后保存到数据库中。
实现步骤是:
(一)首先定义一个jsonitem实体类:
package org.openjweb.core.entity; public class jsonitem { private string sub_id; private string sub_name; private jsonitem[] items; public jsonitem[] getitems() { return items; } public void setitems(jsonitem[] items) { this.items = items; } public string getsub_id() { return sub_id; } public void setsub_id(string sub_id) { this.sub_id = sub_id; } public string getsub_name() { return sub_name; } public void setsub_name(string sub_name) { this.sub_name = sub_name; } }
(二)定义一个工具类,在工具类中读取json数据文件,并进行递归调用 :
public static string importjson(string fullfilename,string jsontype,string encoding,httpservletrequest request) throws exception { //json转换为实体类参考:http://www.cnblogs.com/hoojo/archive/2011/04/21/2023805.html string sreturn = ""; string jsondata = ""; try { jsondata = fileutil.gettextfilecontent(fullfilename, encoding); } catch(exception ex) { sreturn ="读json文件失败!"; } //获取rootid //logger.info(""); jsondata = jsondata.replace("\"items\":\"\"", ""); //去掉空的 items string parentid = jsondata.substring(jsondata.indexof("\"id\":")+5); parentid = parentid.substring(0,parentid.indexof(",")).trim(); parentid = parentid.replace("\"", ""); logger.info("root id=="+parentid); string parentname = jsondata.substring(jsondata.indexof("\"name\":")+7); parentname = parentname.substring(0,parentname.indexof(",")).trim(); parentname = parentname.replace("\"", ""); logger.info("root name=="+parentname); string rootdata = 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(exception ex) { } jsonarray jsonarray = jsonarray.fromobject(rootdata); object[] os = jsonarray.toarray(); jsonitem[] items = (jsonitem[]) jsonarray.toarray(jsonarray, jsonitem.class); savejsonent(jsontype,parentid,parentname,"-1",new long(1)); dealjson(items,parentid,jsontype,new long(1)); return sreturn ; } private static void savejsonent (string jsontype,string jsonid,string jsonname,string parentid,long levelid) throws exception { logger.info(jsontype+"/"+jsonid+"/"+jsonname+"/"+parentid+"/"+string.valueof(levelid)); commjsondata ent = new commjsondata(); ent.setjsontype(jsontype); ent.setjsoncode(jsonid); ent.setjsonname(jsonname); ent.setrowid(stringutil.getuuid()); ent.setparentcode(parentid); ent.setlevelid(levelid); idbsupportservice service = (idbsupportservice)servicelocator.getbean("idbsupportservice3"); service.saveorupdate(ent); } private static string dealjson(jsonitem[] jsonitem,string parentid,string jsontype,long level) { string sreturn = ""; if(jsonitem!=null&&jsonitem.length>0) { for(int i=0;i<jsonitem.length;i++) { jsonitem ent = 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(exception ex) { 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("没有子项!"); } } } //此函数 return sreturn ; }
示例数据(部分):
{ "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对象并存储到数据库的实现