首页 > 编程 > Java > 正文

JSON复杂数据处理之Json树形结构数据转Java对象并存储到数据库的实现

2019-11-26 14:30:54
字体:
来源:转载
供稿:网友

 在网站开发中经常遇到级联数据的展示,比如选择城市的时候弹出的省市县选择界面。很多前端制作人员习惯于从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.htmlString sReturn = "";String jsonData = "";try{jsonData = FileUtil.getTextFileContent(fullFileName, encoding);}catch(Exception ex){sReturn ="读Json文件失败!";}//获取rootId//logger.info("");jsonData = jsonData.replace("/"items/":/"/"", ""); //去掉空的 itemsString 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对象并存储到数据库的实现

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表