微信小程序|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整合。
先使用fastjsonLocation.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;
		}
	}

}

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
地区码area.js大全 代码示例: var dsy = new Dsy(); dsy.add("0",["北京市","天津市","上海市","重庆市","河北省","山西省","内蒙古","辽宁省","吉林省","黑龙江省","江苏省","浙江省","安徽省","福建省","江西省","山东省","河南省","湖北省","湖南省","广东省","广西","海南省","四川省","贵州省","云南省","西藏","陕西省","甘肃省","青海省","宁夏","新疆","香港","澳门","台湾省"]); dsy.add("0_0_0",["东城区","西城区","崇文区","宣武区","朝阳区","丰台区","石景山区","海淀区","门头沟区","房山区","通州区","顺义区","昌平区","大兴区","怀柔区","平谷区","密云县","延庆县","延庆镇"]); dsy.add("0_0",["北京市"]); dsy.add("0_1_0",["和平区","河东区","河西区","南开区","河北区","红桥区","塘沽区","汉沽区","大港区","东丽区","西青区","津南区","北辰区","武清区","宝坻区","蓟县","宁河县","芦台镇","静海县","静海镇"]); dsy.add("0_1",["天津市"]); dsy.add("0_2_0",["黄浦区","卢湾区","徐汇区","长宁区","静安区","普陀区","闸北区","虹口区","杨浦区","闵行区","宝山区","嘉定区","浦东新区","金山区","松江区","青浦区","南汇区","奉贤区","崇明县","城桥镇"]); dsy.add("0_2",["上海市"]); dsy.add("0_3_0",["渝中区","大渡口区","江北区","沙坪坝区","九龙坡区","南岸区","北碚区","万盛区","双桥区","渝北区","巴南区","万州区","涪陵区","黔江区","长寿区","合川市","永川区市","江津市","南川市","綦江县","潼南县","铜梁县","大足县","荣昌县","璧山县","垫江县","武隆县","丰都县","城口县","梁平县","开县","巫溪县","巫山县","奉节县","云阳县","忠县","石柱土家族自治县","彭水苗族土家族自治县","酉阳土家族苗族自治县","秀山土家族苗族自治县"]); dsy.add("0_3",["重庆市"]); ...

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值