起因
考虑到有些时候,可能用户只会填写城市或者县城信息,有时候我们想知道他对应的省份怎么办呢?
清洗思路
就是把所有省份和城市,县城封装到一个类似于集合的地方,就比如前端处理的时候是放js中的,那个js格式和json很像,我想java能不能读json文件呢,应该是可以的,就把之前存放city的js文件处理成json的,放IDEA的resource目录中了,那只要弄清楚结构,一层一层拨开就行了。json文件如下(如有遗漏欢迎补充):https://u7img.oss-cn-hangzhou.aliyuncs.com/city.json
准备工作
还是需要导入对json处理的Maven依赖的。
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.35</version>
</dependency>
代码如下(有注解)
基本每句都有注解,懂json结构,尝试过下面代码debug的,应该还是很清晰的。
package clearTxt.jsTest;
import clearTxt.txtClearArrayList.ConDm;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import org.junit.Test;
import java.io.*;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;
import java.util.Set;
public class jsonToDataTest {
@Test
public void testProvince(){
String city = "许昌市";
String province = cityGetProvince(city);
System.out.println(city+"属于:"+province);
String county = "苍南县";
province = cityGetProvince(county);
System.out.println(county+"属于:"+province);
}
public static void main(String[] args) throws Exception {
}
//TODO 已知city获得province
public static String cityGetProvince(String cityName){
//通过上面那个方法获取json文件的内容
String jsonData = getStr(new File("src/main/resources/city.json"));
//转json对象
JSONObject parse = (JSONObject) JSONObject.parse(jsonData);
//设置最外层省份parse防止为null
assert parse != null;
//获取所有的省份的名字
Set<String> provinces = parse.keySet();
//province为省份名
for (String province : provinces) {
//以获取省份内部数据 为所有城市以及内部信息
JSONArray provinceArray = parse.getJSONArray(province);
//value为该省内市
for (Object value : provinceArray) {
//得到城市以及内部县城名 object向下转型
JSONObject cityArray = (JSONObject) value;
//该城市的城市名 因为就一个值 所以直接将set转list拿到城市名即可
Set<String> cityArrays = cityArray.keySet();
List<String> list = new ArrayList<>(cityArrays);
//城市名
String city = list.get(0);
//如果输入城市名和该省某城市匹配 则返回该城市所在省 直接终止方法了
if (cityName.equals(city)) {
return province;
}
//如果该城市中没找到 就进入该城市内的县城中找
JSONArray countys = cityArray.getJSONArray(city);
//所有县城名 为集合
for (Object o : countys) {
//向下转型成字符串
String county = (String) o;
//如果输入名字和该省某县城匹配 则返回该城市所在省 直接终止方法了
if (cityName.equals(county)) {
return province;
}
}
}
}
return "未找到";
}
//TODO 把一个文件中的内容读取成一个String字符串
public static String getStr(File jsonFile){
String jsonStr = "";
try {
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;
}
}
}
Test测试结果如下: