原创

Java-java解析大json文件-直接定义String会不够长度

JAVA解析大json文件,直接定义String会不够长度

<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.13.5</version>
    //特别注意,如果出现 Failed to introspect Class [com.fasterxml.jackson.databind.ObjectMapper] from ClassLoader [sun.misc.Launcher$AppClassLoader@18b4aac2] 
    那就看看 <groupId>com.fasterxml. 的其他包的版本是不是一致。
</dependency>
import com.alibaba.lindorm.thirdparty.com.fasterxml.jackson.core.type.TypeReference;
import com.alibaba.lindorm.thirdparty.com.fasterxml.jackson.databind.ObjectMapper;

public static void main(String[] args) {
    try {
        // 创建 ObjectMapper 实例
        ObjectMapper objectMapper = new ObjectMapper();
        String file = "D:/workSpace/projects/idea/company/web/src/main/resources/static/area.json";
        // 将 JSON 字符串转换成 Java 对象
        List<AreaJson> people = objectMapper.readValue(new File(file),
                new TypeReference<List<AreaJson>>() {
                });
        // 打印或处理数据
        System.out.println(people);
    } catch (Exception e) {
        System.out.println(e);
    }
}

使用实例:对比area.js ,找到数据库数据缺失的部分

    package cn.jiangjiesheng.vo.common;

    import lombok.Data;
    import java.util.List;

    /**
     * 前端使用的area.js结构
     */
    @Data
    public class AreaJson {
        private String code;
        private String name;
        private List<String> piont;
        private List<AreaJson> children;
    }

    /**
     *
     * 背景:实际选择区域都是来自前端的自己的json数据源,后端主要作为查询名称使用
     *
     * area.js 如果有格式问题,使用 <a href="https://www.json.cn/">找到错误,字段用单引号换成双引号,还有都是]带了逗号 </a>
     *
     * 推荐浏览器访问: <a href="http://127.0.0.1:8800/envtoday/test/handleArea">http://127.0.0.1:8800/envtoday/test/handleArea</a>
     *
     * import addressData from '@/utils/area.js'
     * pis_dic_admin_area
     * city_code 可以为空
     * 用 area_code作为判断标准 要过滤掉"全部"
     *
     * 验证:可以创建相关的缺失的数据,然后刷新数据统计报表
     *  tail -200f ./business.log | grep '出现前端区域编码和数据库不一致的数据'
     *
     * INSERT INTO pis_dic_admin_area (province, city, area, province_code, city_code, area_code, alias, version) 
     * SELECT '北京市', '北京市', '密云县', '110000', '110100', '110228', NULL, '2022' 
     * WHERE NOT EXISTS ( 
     *   SELECT 1 FROM pis_dic_admin_area 
     *   WHERE province_code = '110000' 
     *   AND city_code = '110100' 
     *   AND area_code = '110228' 
     * );
     *  
     */

    @ApiOperation("handleArea")
    @GetMapping("/handleArea")
    public ResponseBean<String> handleArea() {
        try {
            List<String> uniqueKeyListDb = dictAdminAreaService.list(null)
                    .stream().map(DictAdminArea::getAreaCode).collect(Collectors.toList());

            // 创建 ObjectMapper 实例
            ObjectMapper objectMapper = new ObjectMapper();
            String areaJsonFileAbsPath = "D:/workSpace/projects/idea/company/web/src/main/resources/static/area.json";

            ClassLoader classLoader = TestController.class.getClassLoader();
            URL resource = classLoader.getResource("static/area.json");
            if (resource != null) {
                File file = new File(resource.getFile());
                //这里生成的是 \
                areaJsonFileAbsPath = file.getAbsolutePath();
            }
            // 将 JSON 字符串转换成 Java 对象
            List<AreaJson> provinceList = objectMapper.readValue(new File(areaJsonFileAbsPath), new TypeReference<List<AreaJson>>() {
            });
            // 打印或处理数据
            System.out.println(provinceList);
            // 转成平铺的
            List<DictAdminArea> jsList = Lists.newArrayList();
            provinceList.forEach(province -> {

                String provinceName = province.getName();
                String provinceCode = province.getCode();
                if (isNormalData(provinceName, provinceCode)) {
                    List<AreaJson> cityList = province.getChildren();
                    if (CollectionUtils.isNotEmpty(cityList)) {
                        cityList.forEach(city -> {
                            String cityName = city.getName();
                            String cityCode = city.getCode();
                            if (isNormalData(cityName, cityCode)) {
                                List<AreaJson> areaList = city.getChildren();
                                if (CollectionUtils.isNotEmpty(areaList)) {
                                    areaList.forEach(area -> {
                                        String areaName = area.getName();
                                        String areaCode = area.getCode();
                                        if (isNormalData(areaName, areaCode) && !uniqueKeyListDb.contains(areaCode)) {
                                            DictAdminArea dictAdminAreaDbObj = new DictAdminArea();
                                            dictAdminAreaDbObj.setProvince(provinceName);
                                            dictAdminAreaDbObj.setProvinceCode(provinceCode);
                                            dictAdminAreaDbObj.setCity(cityName);
                                            dictAdminAreaDbObj.setCityCode(cityCode);
                                            dictAdminAreaDbObj.setArea(areaName);
                                            dictAdminAreaDbObj.setAreaCode(areaCode);
                                            dictAdminAreaDbObj.setVersion("2022");
                                            jsList.add(dictAdminAreaDbObj);
                                        }
                                    });
                                }
                            }
                        });
                    }
                }
            });

            if (CollectionUtils.isNotEmpty(jsList)) {
                //支持重复执行:
                String INSERT_SQL_TEMPLATE
                        = "INSERT INTO pis_dic_admin_area (province, city, area, province_code, city_code, area_code, alias, version) "
                        + "\r\nSELECT '%s', '%s', '%s', '%s', '%s', '%s', NULL, '%s' "
                        + "\r\nWHERE NOT EXISTS ( "
                        + "\r\n  SELECT 1 FROM pis_dic_admin_area "
                        + "\r\n  WHERE province_code = '%s' "
                        + "\r\n  AND city_code = '%s' "
                        + "\r\n  AND area_code = '%s' "
                        + "\r\n);\r\n";

                List<String> insertSqlList = Lists.newArrayList();
                jsList.forEach(a -> {
                    String insertSql = String.format(INSERT_SQL_TEMPLATE, a.getProvince(), a.getCity(), a.getArea(),
                            a.getProvinceCode(), a.getCityCode(), a.getAreaCode(), a.getVersion(),
                            a.getProvinceCode(), a.getCityCode(), a.getAreaCode()
                    );
                    insertSqlList.add(insertSql);
                });
                String sqlList = "\r\n\r\n" + StringUtils.join(insertSqlList, "\r\n") + "\r\n\r\n";
                //这里是前端多出来的,但是还要过滤
                return new ResponseBean<>(200, "生成差异化区域sql成功", sqlList);
            }
            return new ResponseBean<>(200, "没有差异化区域");
        } catch (Exception e) {
            System.out.println(e.getMessage());
            return new ResponseBean<>(500, "失败:" + e.getMessage());
        }
    }

    /**
     * 符合数据库规则的数据
     * @param name
     * @param code
     * @return
     */
    private boolean isNormalData(String name, String code) {
        boolean isUnNormalData =
                "全部".equals(name) && "".equals(code);
        return !isUnNormalData;
    }
正文到此结束
本文目录