在bean类和Json格式不一样情况下,用Gson解析Json文件,并同时把数据插入MongoDb

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.class

public 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.class

public 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.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;
	

}

这个时候我们首先用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.java

public 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.java

public 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结构思路给大家哈
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值