Json樹形結構數據轉Java對象并存儲到數據庫的實現-超簡單的JSON復雜數據處理

openkk 12年前發布 | 69K 次閱讀 JSON 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"
   },

。。。

轉自:http://blog.csdn.net/baozhengw/article/details/7931797

 本文由用戶 openkk 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!