您的位置:首页 > Web前端 > JavaScript

全国省市县三级行政单位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文件放到该类的包路径下):

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;
}

}


 

 

 

 

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息