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对象并存储到数据库的实现