全国省市县三级行政单位JSON解析,加载到缓存。(何志雄)
2015-01-28 09:06
246 查看
全国省市县三级行政单位JSON解析后加载到缓存。
一、主要实现的功能:
1、将全国JSON格式的文本文件IO读取为字符串。
2、将该字符串进行JSON解析,加载到缓存中。
3、依据省名称,可以查找到该省下的所有城市。
4、依据市名称,可以查找到该市下的所有区县。
5、依据市名称查找该市属于哪个省。
二、执行结果示例:
江苏省下辖市有:[盐城市, 徐州市, 泰州市, 南京市, 扬州市, 常州市, 镇江市, 宿迁市, 苏州市, 淮安市, 连云港市, 南通市, 无锡市]
南京市下辖区县有: [玄武区, 白下区, 秦淮区, 建邺区, 鼓楼区, 下关区, 浦口区, 栖霞区, 雨花台区, 江宁区, 六合区, 溧水县, 高淳县]
南京市属于:江苏省
三、全国省市县三级行政单位JSON格式文件。
请到如下地址下载:http://download.csdn.net/download/tzszhzx/8402791
四、实现代码(需要引入fastJson.jar,并把JSON文件放到该类的包路径下):
一、主要实现的功能:
1、将全国JSON格式的文本文件IO读取为字符串。
2、将该字符串进行JSON解析,加载到缓存中。
3、依据省名称,可以查找到该省下的所有城市。
4、依据市名称,可以查找到该市下的所有区县。
5、依据市名称查找该市属于哪个省。
二、执行结果示例:
江苏省下辖市有:[盐城市, 徐州市, 泰州市, 南京市, 扬州市, 常州市, 镇江市, 宿迁市, 苏州市, 淮安市, 连云港市, 南通市, 无锡市]
南京市下辖区县有: [玄武区, 白下区, 秦淮区, 建邺区, 鼓楼区, 下关区, 浦口区, 栖霞区, 雨花台区, 江宁区, 六合区, 溧水县, 高淳县]
南京市属于:江苏省
三、全国省市县三级行政单位JSON格式文件。
请到如下地址下载:http://download.csdn.net/download/tzszhzx/8402791
四、实现代码(需要引入fastJson.jar,并把JSON文件放到该类的包路径下):
import java.io.BufferedReader; import java.io.File; import java.io.FileNotFoundException; import java.io.FileReader; import java.io.IOException; import java.net.URL; import java.util.ArrayList; import java.util.HashMap; import java.util.Map.Entry; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; public class AreaManager { //省与市的列表键值对,可依据省名,获得该省下的城市列表 @SuppressWarnings("rawtypes") private static HashMap<String, ArrayList> province_city_Map = new HashMap<String, ArrayList>(); //市与省的建值对,可以依据市获取该市属于哪个省。 private static HashMap<String ,String> city_province_Map = new HashMap<String, String>(); //城市与区县的键值对,依据城市名称可以取得该城市下的所有区县列表。 @SuppressWarnings("rawtypes") private static HashMap<String, ArrayList> city_town_Map = new HashMap<String, ArrayList>(); public static void main(String args[]) { //读取全国省市区县三级行政单位JSON文本文件为字符串 String areaStr = readAreaFile(); //将字符串解析,并放到三个缓存中,省对应的市列表、市一一对应的省、市对应的区县列表 loadAllArea(areaStr); //依据省名获得下属的城市列表 System.out.println("江苏省下辖市有:"+getCitysByProvince("江苏省")); //依据城市名称获得下属的区县列表 System.out.println("南京市下辖区县有:"+getTownsByCity("南京市")); //依据城市获得所属于的省 System.out.println("南京市属于:"+getBelongProvince("南京市")); } /** * 从当前路径下读取地区JSON文件转为JSON串。 * @return */ private static String readAreaFile() { URL url = AreaManager.class.getResource(""); File file = new File(url.getPath() + "/area-gb.json"); StringBuffer buffer = new StringBuffer(1024); BufferedReader reader = null; String tempString = null; try { reader = new BufferedReader(new FileReader(file)); while (null != (tempString = reader.readLine())) { buffer.append(tempString); } } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } finally { if (reader != null) { try { reader.close(); } catch (IOException e) { e.printStackTrace(); } } } return buffer.toString(); } /** * 将JSON串中的省、市、区三级单位加载到内存中 * @param areaStr */ private static void loadAllArea(String areaStr) { JSONObject obj = (JSONObject) JSON.parse(areaStr); String province = null; for (Entry<String, Object> provinceCityEntty : obj.entrySet()) { //获得每一个省 province = provinceCityEntty.getKey(); Object cityAndTowns = provinceCityEntty.getValue(); if (cityAndTowns instanceof JSONObject) { ArrayList<String> cityList = new ArrayList<String>(); for (Entry<String, Object> cityEntry : ((JSONObject) cityAndTowns).entrySet()) { //获得该省下的每一个城市 String city = cityEntry.getKey(); cityList.add(city); city_province_Map.put(city, province);//将城市和省建立键值,可通过市名称获得省名称 Object towns = cityEntry.getValue(); if (towns instanceof JSONArray) { JSONArray townArray = (JSONArray) towns; if (townArray.size() > 0) { ArrayList<String> townList = new ArrayList<String>(); for (Object everyTown : townArray) { //取得区县的名称 String town = everyTown.toString(); townList.add(town); //如果以市结尾,说明规模还是可以的,则单独成为市,且也放到省里去 // if (town.endsWith("市")) // { // ArrayList<String> townAlone = new ArrayList<String>(); // townAlone.add(town); // city_town_Map.put(town, townAlone);//单独成为市 // cityList.add(town);//放置到省里去,可以依据省直接获得 // } } city_town_Map.put(city, townList);//将该市下的所有区县进行HASH } } else { System.out.println("地区文件不合法"); } } province_city_Map.put(province, cityList);//将该省下的所有市进行HASH } } } /** * 依据省名称返回该省下的所有城市列表 * @param province * @return */ private static ArrayList<String> getCitysByProvince(String province) { if (null != province && !province.isEmpty()) { return province_city_Map.get(province); } else return null; } /** * 依据城市名称获得该城市下的所有区县列表 * @param city * @return */ private static ArrayList<String> getTownsByCity(String city) { if (null != city && !city.isEmpty()) { return city_town_Map.get(city); } else return null; } /** * 依据市名获得该市所属于的省 * @param city * @return */ private static String getBelongProvince(String city) { if (null != city && !city.isEmpty()) { return city_province_Map.get(city); } else return null; } }
相关文章推荐
- 省市区县三级联动,用json文件本地加载
- 全国省市县三级行政区政府网站收录与管理系统
- 异步加载(AsyncTask异步任务、Handler、Json解析、Lrucache缓存、ListView滑动优化等来实现ListView图文混排)
- 两种方式实现省市县三级联动(利用解析文本和json方式)
- php jquery ajax json 全国省市区三级联动下拉列表 简单实现
- Silverlight项目笔记7:xml/json数据解析、TreeView、引用类型与数据绑定错误、图片加载、虚拟目录设置、silverlight安全机制引发的问题、WebClient缓存问题
- java解析JSON获取全国省市县区域名称
- php jquery ajax json 全国省市区三级联动下拉列表 简单实现
- Android 图片三级缓存加载框架原理解析与代码实现
- php jquery ajax json 全国省市区三级联动下拉列表 简单实现
- jquery全国省市县三级联动
- xml xslt 全国省市县三级树型列表
- 用dom解析xml文件实现省市县三级菜单的级联
- 用php+mysql+json+js+ajax实现省市县三级联动
- android开发--ListView+Json+异步网络图片加载+滚动翻页的例子(图片能缓存,图片不错乱)
- 用dom解析xml的方法实现省市县三级级联菜单
- iBatisNet实现全国省市区县三级联动
- JSON 数据,实现省市县三级联动下拉菜单
- 全国省市级联菜单和省市县三级无刷新菜单
- 全国省市级联菜单和省市县三级无刷新菜单