在bean类和Json格式不一样情况下,用Gson解析Json文件,并同时把数据插入MongoDb
2018-03-06 23:00
661 查看
Gson gson=new Gson();
gson.toJson 把字符串生成Json格式字符串
gson.fromJson 把Json格式字符串转成List,对象等
例如:
User user=gson.from("str",User.class); 解析出来的是User类型
gson.from("",Integer.class) 解析出来是Interger类型
当要把Json格式转成List时可不能 gson.from("",List.class),需要的是对要解析的List类进行解析,解析出一种类似这样List的形态 Type type = new TypeToken<List<Province>>() {
}.getType();
List<Province> list = GsonUtil.gson.fromJson(str, type);这样就解析出集合里面的字段,包括集合里面的集合
----------------------------------------------------------------------------------------------------------------------------------
进入正题,这里解析一个复杂结构的json文件,并且类的结构和json结构不一致,解析出来插入数据库
Json,这个Json里面一个大集合,集合里面内嵌一个集合,集合里面再内嵌一个集合[{"code":"11","name":"北京市","children":[{"code":"1101","name":"市辖区","children":[{"code":"110101","name":"东城区"},{"code":"110102","name":"西城区"},{"code":"110105","name":"朝阳区"},{"code":"110106","name":"丰台区"},{"code":"110107","name":"石景山区"},{"code":"110108","name":"海淀区"},{"code":"110109","name":"门头沟区"},{"code":"110111","name":"房山区"},{"code":"110112","name":"通州区"},{"code":"110113","name":"顺义区"},{"code":"110114","name":"昌平区"},{"code":"110115","name":"大兴区"},{"code":"110116","name":"怀柔区"},{"code":"110117","name":"平谷区"},{"code":"110118","name":"密云区"},{"code":"110119","name":"延庆区"}]}]}]bean类
City.classpublic class City extends DataPlatform{
/**
* 城市ID
*/
@UniqueId
public int cityId;
/**
* 城市名
*/
public String name;
/**
* 英文城市名
* */
public String nameEn;
/**
* 状态 0:停用 1:启用 2:删除{link DataStatus}
*/
public byte status=1;
/**
* 所属省份id
*/
public int provinceId;
/**
* 所属省份名
*/
public String provinceName;
}
Province.classpublic class Province extends DataPlatform{
/**
* 省份id
*/
@UniqueId
public int provinceId=1;
/**
* 省份名称
*/
public String name;
/**
* 英文省份名称
* */
public String nameEn;
/**
* 状态 0:停用 1:启用 2:删除{link DataStatus}
*/
public byte status=1;
}
District.javapublic class District extends DataPlatform{
/**
* 区域id
*/
@UniqueId
public int districtId;
/**
* 区域名
*/
public String name;
/**
* 英文区域名
* */
public String nameEn;
/**
* 所属城市id
*/
public int cityId;
/**
* 状态 0:停用 1:启用 2:删除{link DataStatus}
*/
public byte status=1;
/**
* 城市名称
*/
public String cityName;
}这个时候我们首先用IO读取json文件,json文件放在resources文件夹里,把方法写在service层 public String ReadJson() {
String laststr = "";
File file = new File(this.getClass().getResource("/city.josn").getPath());
BufferedReader reader = null;
try {
FileInputStream in = new FileInputStream(file);
reader = new BufferedReader(new InputStreamReader(in, "gb2312"));
String tempString = null;
while ((tempString = reader.readLine()) != null) {
laststr = laststr + tempString;
}
reader.close();
in.close();
} catch (IOException e) {
e.printStackTrace();
} finally {
if (reader != null) {
try {
reader.close();
} catch (IOException el) {
// TODO: handle exception
}
}
}
return laststr;
}在实体类上建立与json结构一样的字段,并且加上注释@MongoDbExcludable,使该字段加入MongoDb不进行增加
City.javapublic class City extends DataPlatform{
/**
* 城市ID
*/
@UniqueId
public int cityId;
/**
* 城市名
*/
public String name;
/**
* 英文城市名
* */
public String nameEn;
/**
* 状态 0:停用 1:启用 2:删除{link DataStatus}
*/
public byte status=1;
/**
* 所属省份id
*/
public int provinceId;
/**
* 所属省份名
*/
public String provinceName;
@MongoDbExcludable
public int code;
@MongoDbExcludable
public List<District> children;
}
Province.javapublic class Province extends DataPlatform{
/**
* 省份id
*/
@UniqueId
public int provinceId=1;
/**
* 省份名称
*/
public String name;
/**
* 英文省份名称
* */
public String nameEn;
/**
* 状态 0:停用 1:启用 2:删除{link DataStatus}
*/
public byte status=1;
@MongoDbExcludable
public int code;
@MongoDbExcludable
public List<City> children;
}
District.java
public class District extends DataPlatform{
/**
* 区域id
*/
@UniqueId
public int districtId;
/**
* 区域名
*/
public String name;
/**
* 英文区域名
* */
public String nameEn;
/**
* 所属城市id
*/
public int cityId;
/**
* 状态 0:停用 1:启用 2:删除{link DataStatus}
*/
public byte status=1;
/**
* 城市名称
*/
public String cityName;
@MongoDbExcludable
public int code;
}现在结构和json一样了,可以进行对应解析 @Override
public String JsonToDb(String str) {
Type type = new TypeToken<List<Province>>() {
}.getType();
List<Province> list = GsonUtil.gson.fromJson(str, type);
List<City> cityList = new ArrayList<>();
List<District> districtList = new ArrayList<>();
for (Province province : list) {
province.provinceId=province.code;
cityList = province.children;
if (MongoDbClient.getOne(Province.class, new Document().append("code", province.code)) == null) {
MongoDbClient.insert(province);
}//判断存不存在该数据,不存在则添加,方便以后json修改不用进行重复解析
for (City city : cityList) {
city.cityId=city.code;
city.provinceId = province.provinceId;
city.provinceName = province.name;
if (MongoDbClient.getOne(City.class, new Document().append("code", city.code)) == null) {
MongoDbClient.insert(city);
}
districtList = city.children;
for (District district : districtList) {
district.districtId=district.code;
district.cityId = city.cityId;
district.cityName = city.name;
if (MongoDbClient.getOne(District.class, new Document().append("code", district.code)) == null) {
MongoDbClient.insert(district);
}
}
}
}
return null;
}
}然后可以直接调用方法进行解析了 public RspData ReadJsonTodb(ReqData data) {
String str = cityService.ReadJson();
cityService.JsonToDb(str);
return RspData.retSuccess("解析成功");
}因为cityId provinceId districtId是自增的,可以说这3句是不起作用,可以删除,然后打开code字段,把code字段也进行增加,方便查找
district.districtId=district.code;
gson.toJson 把字符串生成Json格式字符串
gson.fromJson 把Json格式字符串转成List,对象等
例如:
User user=gson.from("str",User.class); 解析出来的是User类型
gson.from("",Integer.class) 解析出来是Interger类型
当要把Json格式转成List时可不能 gson.from("",List.class),需要的是对要解析的List类进行解析,解析出一种类似这样List的形态 Type type = new TypeToken<List<Province>>() {
}.getType();
List<Province> list = GsonUtil.gson.fromJson(str, type);这样就解析出集合里面的字段,包括集合里面的集合
----------------------------------------------------------------------------------------------------------------------------------
进入正题,这里解析一个复杂结构的json文件,并且类的结构和json结构不一致,解析出来插入数据库
Json,这个Json里面一个大集合,集合里面内嵌一个集合,集合里面再内嵌一个集合[{"code":"11","name":"北京市","children":[{"code":"1101","name":"市辖区","children":[{"code":"110101","name":"东城区"},{"code":"110102","name":"西城区"},{"code":"110105","name":"朝阳区"},{"code":"110106","name":"丰台区"},{"code":"110107","name":"石景山区"},{"code":"110108","name":"海淀区"},{"code":"110109","name":"门头沟区"},{"code":"110111","name":"房山区"},{"code":"110112","name":"通州区"},{"code":"110113","name":"顺义区"},{"code":"110114","name":"昌平区"},{"code":"110115","name":"大兴区"},{"code":"110116","name":"怀柔区"},{"code":"110117","name":"平谷区"},{"code":"110118","name":"密云区"},{"code":"110119","name":"延庆区"}]}]}]bean类
City.classpublic class City extends DataPlatform{
/**
* 城市ID
*/
@UniqueId
public int cityId;
/**
* 城市名
*/
public String name;
/**
* 英文城市名
* */
public String nameEn;
/**
* 状态 0:停用 1:启用 2:删除{link DataStatus}
*/
public byte status=1;
/**
* 所属省份id
*/
public int provinceId;
/**
* 所属省份名
*/
public String provinceName;
}
Province.classpublic class Province extends DataPlatform{
/**
* 省份id
*/
@UniqueId
public int provinceId=1;
/**
* 省份名称
*/
public String name;
/**
* 英文省份名称
* */
public String nameEn;
/**
* 状态 0:停用 1:启用 2:删除{link DataStatus}
*/
public byte status=1;
}
District.javapublic class District extends DataPlatform{
/**
* 区域id
*/
@UniqueId
public int districtId;
/**
* 区域名
*/
public String name;
/**
* 英文区域名
* */
public String nameEn;
/**
* 所属城市id
*/
public int cityId;
/**
* 状态 0:停用 1:启用 2:删除{link DataStatus}
*/
public byte status=1;
/**
* 城市名称
*/
public String cityName;
}这个时候我们首先用IO读取json文件,json文件放在resources文件夹里,把方法写在service层 public String ReadJson() {
String laststr = "";
File file = new File(this.getClass().getResource("/city.josn").getPath());
BufferedReader reader = null;
try {
FileInputStream in = new FileInputStream(file);
reader = new BufferedReader(new InputStreamReader(in, "gb2312"));
String tempString = null;
while ((tempString = reader.readLine()) != null) {
laststr = laststr + tempString;
}
reader.close();
in.close();
} catch (IOException e) {
e.printStackTrace();
} finally {
if (reader != null) {
try {
reader.close();
} catch (IOException el) {
// TODO: handle exception
}
}
}
return laststr;
}在实体类上建立与json结构一样的字段,并且加上注释@MongoDbExcludable,使该字段加入MongoDb不进行增加
City.javapublic class City extends DataPlatform{
/**
* 城市ID
*/
@UniqueId
public int cityId;
/**
* 城市名
*/
public String name;
/**
* 英文城市名
* */
public String nameEn;
/**
* 状态 0:停用 1:启用 2:删除{link DataStatus}
*/
public byte status=1;
/**
* 所属省份id
*/
public int provinceId;
/**
* 所属省份名
*/
public String provinceName;
@MongoDbExcludable
public int code;
@MongoDbExcludable
public List<District> children;
}
Province.javapublic class Province extends DataPlatform{
/**
* 省份id
*/
@UniqueId
public int provinceId=1;
/**
* 省份名称
*/
public String name;
/**
* 英文省份名称
* */
public String nameEn;
/**
* 状态 0:停用 1:启用 2:删除{link DataStatus}
*/
public byte status=1;
@MongoDbExcludable
public int code;
@MongoDbExcludable
public List<City> children;
}
District.java
public class District extends DataPlatform{
/**
* 区域id
*/
@UniqueId
public int districtId;
/**
* 区域名
*/
public String name;
/**
* 英文区域名
* */
public String nameEn;
/**
* 所属城市id
*/
public int cityId;
/**
* 状态 0:停用 1:启用 2:删除{link DataStatus}
*/
public byte status=1;
/**
* 城市名称
*/
public String cityName;
@MongoDbExcludable
public int code;
}现在结构和json一样了,可以进行对应解析 @Override
public String JsonToDb(String str) {
Type type = new TypeToken<List<Province>>() {
}.getType();
List<Province> list = GsonUtil.gson.fromJson(str, type);
List<City> cityList = new ArrayList<>();
List<District> districtList = new ArrayList<>();
for (Province province : list) {
province.provinceId=province.code;
cityList = province.children;
if (MongoDbClient.getOne(Province.class, new Document().append("code", province.code)) == null) {
MongoDbClient.insert(province);
}//判断存不存在该数据,不存在则添加,方便以后json修改不用进行重复解析
for (City city : cityList) {
city.cityId=city.code;
city.provinceId = province.provinceId;
city.provinceName = province.name;
if (MongoDbClient.getOne(City.class, new Document().append("code", city.code)) == null) {
MongoDbClient.insert(city);
}
districtList = city.children;
for (District district : districtList) {
district.districtId=district.code;
district.cityId = city.cityId;
district.cityName = city.name;
if (MongoDbClient.getOne(District.class, new Document().append("code", district.code)) == null) {
MongoDbClient.insert(district);
}
}
}
}
return null;
}
}然后可以直接调用方法进行解析了 public RspData ReadJsonTodb(ReqData data) {
String str = cityService.ReadJson();
cityService.JsonToDb(str);
return RspData.retSuccess("解析成功");
}因为cityId provinceId districtId是自增的,可以说这3句是不起作用,可以删除,然后打开code字段,把code字段也进行增加,方便查找
district.districtId=district.code;
province.provinceId=province.code;
city.cityId=city.code;这样就解析成功了,这里只是提供一种解析这种复杂的json结构思路给大家哈
相关文章推荐
- Gson解析(List和Map)格式json数据
- Android自带json和Gson数据格式解析示列
- gson解析json数据格式为object对象
- JSON数据的格式和解析(使用GSON)入门
- Gson解析JSON格式数据
- python读取json文件并将数据插入到mongodb的方法
- Gson解析(List和Map)格式json数据
- Android连接服务器数据库查询+Gson解析(List和Map)格式json数据(一)
- Gson解析Json格式数据
- 利用 js-xlsx 实现 Excel 文件导入并解析Excel数据成json格式的数据
- JSON格式数据解析及GSON框架的使用详解
- Android连接服务器数据库查询+Gson解析(List和Map)格式json数据(二)
- struts2 + ajax(由前台的form提交数据到后台,再根据form所调用返回获取的后台json格式的数据返回到前端,然后前端用jquery对json数据进行解析)==》》涉及文件上传的部分
- json数据格式之Gson解析
- 用GSON解析Json格式数据
- Java-json系列(一):用GSON解析Json格式数据
- Gson 解析Json结构,泛型转为List 集合会出现擦除数据的情况
- Java-json系列(一):用GSON解析Json格式数据
- android studio添加Gson,并使用Gson生成和解析json格式数据
- 很好用的Google 开源项目Gson在java中解析和创建json格式的数据