area组件使用的地址数据文件
前言
实战篇内容参考:
1、腾讯的全球地址数据文件及Xml->Json的处理
1、area组件使用的地址文件结构
area
组件使用的地址数据文件是将数据按“省、市、区
”划分的。每个list中都是code : name
键值对形式对应。code是六位数编码,前两位代表省份,中间两位代表城市,后两位代表区县,以 0 补足 6 位。如北京编码为 11
,以零补足 6 位,为 110000
。
2、腾讯的全球地址数据文件结构
{
"Location": {
"CountryRegion": [{
"State": [{
"City": [{
"Code": 1,
"Name": "东城"
}, {
"Code": 2,
"Name": "西城"
}, {
"Code": 5,
"Name": "朝阳"
}, {
"Code": 6,
"Name": "丰台"
}, {
"Code": 7,
"Name": "石景山"
}, {
"Code": 8,
"Name": "海淀"
}, {
"Code": 9,
"Name": "门头沟"
}
......
}
该数据结构是按“CountryRegion、State、City
”划分的。也是以code和name形式组织数据,但是这里的code没有按位置映射城市名,code只是作为一个在city内部的区分键。
3、两个数据结构的融合
将海外code以9开头的城市使用腾讯数据文件Location.js
整合。
先使用fastjson
将Location.json
进行解析取出海外所有的国家及城市。
3.1 fastjson 解析复杂嵌套json字符串
// 初始json对象 读取的json串
String s = readJsonFile(path);
JSONObject key = JSON.parseObject(s).getJSONObject("Location");
// 解析json对象
JSONObject obj = (JSONObject) key.get("State");
// json数组
JSONArray array = key.getJSONArray("State");
https://www.cnblogs.com/dmego/p/9033080.html
https://blog.csdn.net/eddie233/article/details/73730283
https://www.cnblogs.com/wkfvawl/p/11876107.html
3.2 判断json对象的属性的值是json对象还是json数组
String city_data = key2.getString("City");
// 进一步判断City是json数组 or json对象
// 解析json数组
if (city_data.startsWith("[")) {
// json数组
}else{
// json对象
}
3.3 使用fastjson解析Location.json—复杂json对象。
Location.json
文件分析。
3.3.1 中国国内城市json结构:
CountryRegion:[
{ State:[
{ City:[
{ Region:[{ code: 1,name: "123" }, { code: 2,name: "456"}],
code: 1,
name: "北京" }]
}],
code: 1,
name: "中国"
},
{ State:[ { } ] },
...
]
3.3.2 海外城市json结构:
CountryRegion:[
{ State:[
{ City:[
{ code: 1,name: "123" }, { code: 2,name: "456"},]
}],
code: 1,
name: "阿尔巴尼亚"
},
{ State:[ { } ] },
...
]
3.3.3 中国国内城市json结构:
代码冗长所以放最后了。。。
/**
* @Title: JsonDealWith.java
* @Description: TODO(描述)
* @author Raffaello
* @date 2021-02-09 11:53:47
*/
package JsonUtils;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.Reader;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
public class JsonDealWith {
// target: json 外国国名: [ 城市名1,城市名2,城市名3...]
public static void main(String[] args) {
StringBuilder sb = new StringBuilder();
sb.append("{");
// ***相对路径是jvm,默认是文件夹JsonTest下
String path = "./src/JsonUtils/Location.json";
String s = readJsonFile(path);
JSONObject jobj = JSON.parseObject(s).getJSONObject("Location");
// 1、解析第一层,按字段CountryRegion分割
JSONArray locations = jobj.getJSONArray("CountryRegion");
System.out.println("country:" + locations.size());
// 遍历每个国家
for (int i = 0; i < locations.size(); i++) {
JSONObject key1 = (JSONObject) locations.get(i);
// 国家名称
System.out.println("********************************");
System.out.println("国家名称:" + key1.get("Name"));
String countryName = (String) key1.get("Name");
// 舍去国内所有城市
if (!countryName.equals("中国")) {
// System.out.println("123");
// 外国城市
if (!key1.containsKey("State")) {
continue;
}
// 2、解析第二层,每个国家按字段State分割
// 判断State是json数组还是json对象
String state_data = key1.getString("State");
// System.out.println(state_data);
// 以[或{开头的
if (state_data.startsWith("[")) {
// json数组
JSONArray state = key1.getJSONArray("State");
System.out.println("城市的数量:" + state.size());
for (int j = 0; j < state.size(); j++) {
JSONObject key2 = (JSONObject) state.get(j);
// 城市名称
System.out.println("城市名称:" + key2.get("Name"));
// 3、解析第三层,按字段City分割
// ***判断有无City属性,判断City是json数组还是json对象
if (key2.containsKey("City")) {
String city_data = key2.getString("City");
// 进一步判断City是json数组 or json对象
// 解析json数组
if (city_data.startsWith("[")) {
JSONArray city = key2.getJSONArray("City");
// 市的数量
System.out.println("市的数量:" + city.size());
for (int k = 0; k < city.size(); k++) {
JSONObject key3 = (JSONObject) city.get(k);
// 市名称,直辖市只有city
System.out.println("市名称:" + key3.get("Name"));
// 4、解析第四层,按字段Region分割
// city下面的区名称, 对region判空
if (key3.containsKey("Region")) {
String region_data = key3.getString("Region");
// 进一步判断Region是json数组 or json对象
// 解析json数组
if (region_data.startsWith("[")) {
JSONArray region = key3.getJSONArray("Region");
// 区的数量
System.out.println("区县的数量:" + region.size());
for (int l = 0; l < region.size(); l++) {
JSONObject key4 = (JSONObject) region.get(l);
// Integer region_code = (Integer) key4.get("Code");
String region_name = (String) key4.get("Name");
System.out.println("区县名称:" + region_name);
}
} else {
// 解析json对象
JSONObject region = (JSONObject) key3.get("Region");
// Integer region_code = (Integer) region.get("Code");
String region_name = (String) region.get("Name");
System.out.println("区县名称:" + region_name);
}
}
} // 所有的市
} else {
// 解析json对象
JSONObject city = key2.getJSONObject("City");
// 判断有无Region属性,Region是json数组 or json对象
// 4、解析第四层,按字段Region分割
// city下面的区名称, 对region判空
if (city.containsKey("Region")) {
String region_data = city.getString("Region");
// 进一步判断Region是json数组 or json对象
// 解析json数组
if (region_data.startsWith("[")) {
JSONArray region = city.getJSONArray("Region");
// 区的数量
System.out.println("区县的数量:" + region.size());
for (int l = 0; l < region.size(); l++) {
JSONObject key4 = (JSONObject) region.get(l);
// Integer region_code = (Integer) key4.get("Code");
String region_name = (String) key4.get("Name");
System.out.println("区县名称:" + region_name);
}
} else {
// 解析json对象
JSONObject region = (JSONObject) city.get("Region");
// Integer region_code = (Integer) region.get("Code");
String region_name = (String) region.get("Name");
System.out.println("区县名称:" + region_name);
}
} else {
// Integer city_code = (Integer) city.get("Code");
String city_name = (String) city.get("Name");
System.out.println("城市(省)名称:" + city_name);
}
}
}
} // 所有的省(城市)
} else {
// json对象
JSONObject state = key1.getJSONObject("State");
// 3、解析第三层,按字段City分割
// ***判断有无City属性,判断City是json数组还是json对象
if (state.containsKey("City")) {
String city_data = state.getString("City");
// 进一步判断City是json数组 or json对象
// 解析json数组
if (city_data.startsWith("[")) {
JSONArray city = state.getJSONArray("City");
// 市的数量
System.out.println("市的数量:" + city.size());
for (int k = 0; k < city.size(); k++) {
JSONObject key3 = (JSONObject) city.get(k);
// 市名称,直辖市只有city
System.out.println("市名称:" + key3.get("Name"));
// 4、解析第四层,按字段Region分割
// city下面的区名称, 对region判空
if (key3.containsKey("Region")) {
String region_data = key3.getString("Region");
// 进一步判断Region是json数组 or json对象
// 解析json数组
if (region_data.startsWith("[")) {
JSONArray region = key3.getJSONArray("Region");
// 区的数量
System.out.println("区县的数量:" + region.size());
for (int l = 0; l < region.size(); l++) {
JSONObject key4 = (JSONObject) region.get(l);
// Integer region_code = (Integer) key4.get("Code");
String region_name = (String) key4.get("Name");
System.out.println("区县名称:" + region_name);
}
} else {
// 解析json对象
JSONObject region = (JSONObject) key3.get("Region");
// Integer region_code = (Integer) region.get("Code");
String region_name = (String) region.get("Name");
System.out.println("区县名称:" + region_name);
}
}
} // 所有的市
} else {
// 解析json对象
JSONObject city = state.getJSONObject("City");
// 判断有无Region属性,Region是json数组 or json对象
// 4、解析第四层,按字段Region分割
// city下面的区名称, 对region判空
if (city.containsKey("Region")) {
String region_data = city.getString("Region");
// 进一步判断Region是json数组 or json对象
// 解析json数组
if (region_data.startsWith("[")) {
JSONArray region = city.getJSONArray("Region");
// 区的数量
System.out.println("区县的数量:" + region.size());
for (int l = 0; l < region.size(); l++) {
JSONObject key4 = (JSONObject) region.get(l);
// Integer region_code = (Integer) key4.get("Code");
String region_name = (String) key4.get("Name");
System.out.println("区县名称:" + region_name);
}
} else {
// 解析json对象
JSONObject region = (JSONObject) city.get("Region");
// Integer region_code = (Integer) region.get("Code");
String region_name = (String) region.get("Name");
System.out.println("区县名称:" + region_name);
}
} else {
// Integer city_code = (Integer) city.get("Code");
String city_name = (String) city.get("Name");
System.out.println("城市(省)名称:" + city_name);
}
}
}
}
// 外国城市
}
// break;
}
}
// 读取json文件方法
public static String readJsonFile(String fileName) {
String jsonStr = "";
try {
File jsonFile = new File(fileName);
FileReader fileReader = new FileReader(jsonFile);
Reader reader = new InputStreamReader(new FileInputStream(jsonFile), "utf-8");
int ch = 0;
StringBuffer sb = new StringBuffer();
while ((ch = reader.read()) != -1) {
sb.append((char) ch);
}
fileReader.close();
reader.close();
jsonStr = sb.toString();
return jsonStr;
} catch (IOException e) {
e.printStackTrace();
return null;
}
}
}