最近在使用项目中的区域表时,发现了有区域缺失的情况,于是找了个较新的省市区数据来解析更新到区域表中。
数据来源:https://blog.csdn.net/supergao222/article/details/79102140
下面使用的是fastJson来解析。看到analysisJson方法就行了,getAreaCodeList是构造自己的数据进行的操作,因人而异。
public class AreaCodeAnalysis {
@Test
public void getAreaCodeList() {
File file = new File("C:\\Users\\Administrator\\Desktop\\areaJson.txt");
String jsonString = txt2String(file);
JSONObject jsonObject = JSON.parseObject(jsonString);
// 解析json
List<Area> areaList = analysisJson(jsonObject);
// 得到areaList之后,就可以构造自己想要的数据,然后进行其它操作,如插入到数据库中等
List<MainAreaCode> areaCodeList = getAreaCodeList(areaList);
}
// 解析json得到areaList
public List<Area> analysisJson(JSONObject jsonObject) {
List<Area> areaList = new ArrayList<>();
Set<String> set = jsonObject.keySet();
for (Iterator<String> it = set.iterator(); it.hasNext();) {
Area area = new Area();
String key = it.next();
Object obj = jsonObject.get(key);
// 已经解析到区,obj.toString()的值为“··区”,如“蓬江区”
// 不设辖区的市,如“{"child":[],"name":"东莞市"}”
// 则不继续向下解析
if (!obj.toString().endsWith("}") && !obj.toString().startsWith("{")) {
area.setName(obj.toString());
} else if (obj.toString().indexOf("[]") == 9) {
JSONObject jo = JSON.parseObject(obj.toString());
area.setName(jo.get("name").toString());
} else {
area = JSON.parseObject(obj.toString(), Area.class);
area.setAreaChildList(analysisJson(area.getChild()));
}
area.setAreaCode(key);
areaList.add(area);
}
return areaList;
}
// 读取txt
public String txt2String(File file) {
StringBuilder result = new StringBuilder();
try {
BufferedReader br = new BufferedReader(new FileReader(file));// 构造一个BufferedReader类来读取文件
String s = null;
while ((s = br.readLine()) != null) {// 使用readLine方法,一次读一行
result.append(s);
}
br.close();
} catch (Exception e) {
e.printStackTrace();
}
return result.toString();
}
// 构造自己的MainAreaCode数据
public List<MainAreaCode> getAreaCodeList(List<Area> areaList) {
List<MainAreaCode> areaCodeList = new ArrayList<>();
for (Area area : areaList) {
MainAreaCode areaCode = new MainAreaCode();
areaCode.setProvince(area.getName());
areaCode.setAreaCode(area.getAreaCode());
areaCode.setAreaLevel("0");
areaCode.setAreaStatus("1");
areaCodeList.add(areaCode);
if (null != area.getAreaChildList()) {
areaCodeList.addAll(getSecondAreaCodeList(area.getAreaChildList(), area.getName()));
}
}
return areaCodeList;
}
// 市级数据
public List<MainAreaCode> getSecondAreaCodeList(List<Area> areaList, String province) {
List<MainAreaCode> areaCodeList = new ArrayList<>();
for (Area area : areaList) {
MainAreaCode areaCode = new MainAreaCode();
areaCode.setProvince(province);
areaCode.setCity(area.getName());
areaCode.setAreaCode(area.getAreaCode());
areaCode.setAreaLevel("1");
areaCode.setAreaStatus("1");
areaCodeList.add(areaCode);
if (null != area.getAreaChildList()) {
areaCodeList.addAll(getThirdAreaCodeList(area.getAreaChildList(), province, area.getName()));
}
}
return areaCodeList;
}
// 区/县级数据
public List<MainAreaCode> getThirdAreaCodeList(List<Area> areaList, String province, String city) {
List<MainAreaCode> areaCodeList = new ArrayList<>();
for (Area area : areaList) {
MainAreaCode areaCode = new MainAreaCode();
areaCode.setProvince(province);
areaCode.setCity(city);
areaCode.setCountry(area.getName());
areaCode.setAreaCode(area.getAreaCode());
areaCode.setAreaLevel("2");
areaCode.setAreaStatus("1");
areaCodeList.add(areaCode);
}
return areaCodeList;
}
}
public class Area {
private String areaCode;
private String name;
private JSONObject child;// 存放暂时未解析的jsonChild
private List<Area> areaChildList;// 已解析完毕child
public String getAreaCode() {
return areaCode;
}
public void setAreaCode(String areaCode) {
this.areaCode = areaCode;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public JSONObject getChild() {
return child;
}
public void setChild(JSONObject child) {
this.child = child;
}
public List<Area> getAreaChildList() {
return areaChildList;
}
public void setAreaChildList(List<Area> areaChildList) {
this.areaChildList = areaChildList;
}
}