Java行政区划代码处理,包含源JSON文件,处理过后的JSONExcelSQL文件

Posted 符华-

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java行政区划代码处理,包含源JSON文件,处理过后的JSONExcelSQL文件相关的知识,希望对你有一定的参考价值。

参考

民政部最新的行政区划代码

前言

一开始是想直接解析民政部的html,获取里面的数据,然后我发现这个html不规范,解析一直报错,什么xx标签的属性值应当要引号、xx标签没有闭合。。。

所以我放弃了解析html的想法,直接找前端要了份数据。

数据

我需要的格式:

DROP TABLE IF EXISTS `sys_city`;
CREATE TABLE `sys_city`  (
  `id` bigint NOT NULL AUTO_INCREMENT COMMENT 'id',
  `pid` bigint NULL DEFAULT NULL COMMENT '父级id',
  `name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '名称',
  `code` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '编码',
  `intact_code` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '完整编码',
  `level` int NULL DEFAULT NULL COMMENT '等级(1 省级 2 市级 3 县级)',
  PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 249 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '全国各省市区县代码' ROW_FORMAT = DYNAMIC;

先看看这几份数据:

1、data.json

2、demo.json

3、source.json

4、target.json

5、target.xls(直接将这份数据导进数据库中)

6、targetSql.json

数据处理

import cn.hutool.core.collection.CollUtil;
import cn.hutool.json.JSONUtil;
import cn.hutool.poi.excel.ExcelUtil;
import cn.hutool.poi.excel.ExcelWriter;
import com.common.util.TreeUtil;
import lombok.Data;

import java.io.*;
import java.util.ArrayList;
import java.util.List;

public class Main 

    @Data
    public static class Entity
        private String value;
        private String label;
        private List<Entity> children;
    

    @Data
    public static class SysCity
        private String id;
        private String pid;
        private String name;
        private String code;
        private String intactCode;
        private Integer level;
        public List<SysCity> children = new ArrayList<>();
    

	/**
     * 输出到txt文件
     */
    private static void exportTxt(List<SysCity> dataList) throws IOException 
        String content = JSONUtil.toJsonStr(dataList);
        String path = "C:\\\\Users\\\\Admin\\\\Desktop\\\\target.txt";
        FileWriter fileWriter = new FileWriter(path,false);
        fileWriter.write(content);
        fileWriter.flush();
        fileWriter.close();
    

    /**
     * 输出到excel文件
     */
    private static void exportExcel(List<SysCity> dataList) throws IOException 
        List<List<String>> rowAll = new ArrayList<List<String>>();
        List<String> row = CollUtil.newArrayList("id", "pid", "name", "code", "intact_code","level");
        rowAll.add(row);
        // 循环添加数据到excel中
        for (int i = 0; i < dataList.size(); i++) 
            SysCity city = dataList.get(i);
            List<String> rowItem = CollUtil.newArrayList(city.getId(),city.getPid(),city.getName(),city.getCode(),city.getIntactCode(),String.valueOf(city.getLevel()));
            rowAll.add(rowItem);
        
        ExcelWriter writer = ExcelUtil.getWriter();
        writer.setColumnWidth(-1, 30);
        writer.setRowHeight(-1,20);
        FileOutputStream output = new FileOutputStream("C:\\\\Users\\\\Admin\\\\Desktop\\\\target.xls");
        // 一次性写出内容
        writer.write(rowAll);
        writer.flush(output);
        // 关闭writer,释放内存
        writer.close();
    

    /**
     * 输出到json文件
     */
    private static void exportJson(List<SysCity> dataList) throws IOException 
    	// 输出的json需要有层级结构,所以需要将dataList构建为树结构
        List<SysCity> list = TreeUtil.buildTree(dataList, "0", "pid");
        String content = JSONUtil.toJsonStr(list);
        String path = "C:\\\\Users\\\\Admin\\\\Desktop\\\\target.json";
        FileWriter fileWriter = new FileWriter(path,false);
        fileWriter.write(content);
        fileWriter.flush();
        fileWriter.close();
    

    public static void main(String[] args) throws IOException 
        List<Entity> list = readSourceTxt();
        List<SysCity> dataList = new ArrayList<>();
        int id = 1;
        String pid="0";
        getCityList(list,dataList,id,pid);
        // 生成txt文件
        exportTxt(dataList);
        // 生成excel
        exportExcel(dataList);
        // 生成json文件
        exportJson(dataList);
    

    /**
     * 读取源文件,解析为json格式,添加到list中
     */
    private static List<Entity> readSourceTxt() throws IOException 
        String path = System.getProperty("user.dir")+"\\\\src\\\\test\\\\java\\\\com\\\\source.txt";
        File file = new File(path);
        BufferedReader br = new BufferedReader(new FileReader(file));
        StringBuilder sb = new StringBuilder();
        String st;
        while ((st = br.readLine()) != null) 
            sb.append(st);
        
        return JSONUtil.toList(sb.toString(), Entity.class);
    

    /**
     * 数据处理
     * @param list 原始数据
     * @param dataList 目标数据
     * @param id id
     * @param pid 父级id
     */
    public static int getCityList(List<Entity> list,List<SysCity> dataList,int id,String pid)
        for (Entity entity : list) 
            SysCity city = new SysCity();
            city.setId(String.valueOf(id));
            city.setName(entity.getLabel());
            city.setIntactCode(entity.getValue());
            String code = entity.getValue();
            //源数据的编码都是六位数,省级后面四位都是0,去掉;市级后面两位是0,去掉;县(区)级取全部
            if (code.endsWith("0000"))
                code = code.replace("0000","");
                city.setLevel(1);
            else if (code.endsWith("00"))
                code = code.replace("00","");
                city.setLevel(2);
            else 
                city.setLevel(3);
            
            //code只取最后两位,完整的编码前面几位都是由它的父级组成的,intactCode存储的是完整的编码
            city.setCode(code.substring(code.length()-2));
            city.setPid(pid);
            dataList.add(city);
            id++;
            List<Entity> children = entity.getChildren();
            if (children != null && !children.isEmpty())
                id = getCityList(children,dataList,id, city.getId());
            
        
        return id;
    

/**
 * 构建树结构工具类
 */
public class TreeUtil 

    /**
     * 根据反射获取属性值
     * @param t 实体对象
     * @param fieldName 属性名称
     */
    private static<T> Object getFieldValue(T t,String fieldName)
        Field field = ReflectUtil.getField(t.getClass(), fieldName);
        return ReflectUtil.getFieldValue(t, field);
    

	/**
     * 获取树结构
     * @param list 数据
     */
    public static<T> List<T> buildTree(List<T> list) 
        return buildTree(list, "0","parentId");
    

    /**
     * 获取树结构
     * @param list 数据
     * @param pId 父级id
     * @param fieldName 父级字段名称
     */
    public static<T> List<T> buildTree(List<T> list,String pId,String fieldName) 
        List<T> root= new ArrayList<>();
        Iterator<T> it = list.iterator();
        while (it.hasNext()) 
            T t = it.next();
            String parentId = getFieldValue(t,fieldName).toString();
            if (parentId.equals(pId)) 
                root.add(t);
                //it.remove();
            
        
        getChild(root, list,fieldName);
        return root;
    

    /**
     * 递归子节点
     */
    public static<T> void getChild(List<T> root,List<T> list,String fileName)
        try 
            for (T nav : root) 
                String id = getFieldValue(nav,"id").toString();
                List<T> childList = buildTree(list, id,fileName);
                getChild(childList, list,fileName);
                Field child = ReflectUtil.getField(nav.getClass(), "children");
                child.set(nav,childList);
            
        catch (Exception e)
            e.printStackTrace();
        
    

最后

行政区划代码资源文件下载:

链接: 网盘下载 提取码: yxpr
链接: csdn下载

以上是关于Java行政区划代码处理,包含源JSON文件,处理过后的JSONExcelSQL文件的主要内容,如果未能解决你的问题,请参考以下文章

最新县及县以上行政区划代码JSON数据(截止9月30日)含经纬度数据

Python 处理包含对象列表的大型 JSON 文件

字符串文件操作,英文词频统计预处理

使用 gulp 生成源映射

数据处理——利用Excel VBA批量将详细地址转换成省市区三级行政区划

数据处理——利用Excel VBA批量将详细地址转换成省市区三级行政区划