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;
}
正文到此结束