日期:2014-05-16  浏览次数:20433 次

Json树形结构数据转Java对象并存储到数据库的实现-超简单的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");
  
  ro