웹사이트 개발을 하다 보면 도시를 선택할 때 팝업으로 나타나는 도, 시, 군 선택 인터페이스 등 계단식 데이터가 표시되는 경우를 자주 접하게 됩니다. 많은 프런트엔드 개발자는 데이터베이스 대신 JSON에서 지방, 시, 군 데이터를 얻는 데 익숙합니다. 그런 다음 지방, 시, 군에서 도시를 선택한 후 선택한 도시의 코드를 데이터베이스에 저장해야 합니다. 따라서 JSON 데이터(일반적으로 자바스크립트 스크립트에 저장됨)의 전체 구조를 데이터베이스로 가져올 수 있는 기능이 필요합니다.
JSON은 배열로 표현되는 계층 구조와 객체를 지원하는 것이 특징입니다. 다음 예에서는 JSON의 도, 시, 군 데이터를 데이터베이스에 저장하는 방법을 소개합니다. 구현 원리는 매우 간단합니다. 즉, JSON Java 툴킷 API를 사용하여 계층적 JSON 객체 배열을 재귀를 통해 Java 객체 배열로 변환하는 것입니다. 그런 다음 데이터베이스에 저장합니다.
구현 단계는 다음과 같습니다.
(1) 먼저 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; } }
(2) 도구 클래스를 정의하고 도구 클래스에서 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 객체로 변환하여 데이터베이스에 저장
복잡한 JSON 데이터 처리를 위해 JSON 트리 구조 데이터를 Java 객체로 변환하고 데이터베이스에 저장하는 방법에 대한 자세한 관련 기사는 PHP에 주목하세요. 중국사이트!