欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2024-03-09 16:00:29
 在网站开发中经常遇到级联数据的展示,比如选择城市的时候弹出的省市县选择界面。很多前端制作人员习惯于从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对象并存储到数据库的实现