JAVA根据城市或者县城判断出所属省份

起因

考虑到有些时候,可能用户只会填写城市或者县城信息,有时候我们想知道他对应的省份怎么办呢?

清洗思路

就是把所有省份和城市,县城封装到一个类似于集合的地方,就比如前端处理的时候是放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测试结果如下:

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值