您的位置:首页 > 数据库 > Mongodb

在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;
province.provinceId=province.code;
city.cityId=city.code;
这样就解析成功了,这里只是提供一种解析这种复杂的json结构思路给大家哈
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  Gson MongoDb Json