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

JAVA解析大json文件,直接定义String会不够长度
最新版本更新
https://code.jiangjiesheng.cn/article/357?from=csdn

<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;
	}
**最新版本更新**
[https://code.jiangjiesheng.cn/article/357?from=csdn](https://code.jiangjiesheng.cn/article/357?from=csdn)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值