公司老大给了个任务,让我将MongoDB一个Collection中的数据导入另一个库中的Collection,我一开始以为不怎么难,但是,一查数据才发现问题,我去2千万条.我花了半天的时间搞完了也可以用了(不得不夸一下MongoDB,确实强大).接下问题又来了,老大又让我插入以前丢掉的数据.这才是难题,所有的数据都是json文件,这些文件总共600M左右,而且与MongoDB中的数据格式还不一样.一开始以为完了.但是功夫怕有心人,搞了一天最终还是搞出来了.我的大体思路是这样的首先我要找到所有的json文件然后读取这些文件的内容,将这些内容通过Gson转化Map,然后就可以封装了.下面是我具体的实现,有需要的可以拿去用,有问题的也可以问我.
一.找到json文件
找到文件我是通过一个简单的递归找到的.传的参数为你存放Json的文件夹,尽量准确因为递归次数多的话效率会很底
//递归遍历得到json文件 public static void getFiles(String filePath) throws IOException { File root = new File(filePath); //判断第一次输入的是否为文件夹 if (root.isDirectory()) { //获取给文件夹下的所有File File[] files = root.listFiles(); //遍历 for (File file : files) { //判断是否文件夹 if (file.isDirectory()) { //是文件夹的话进行递归 getFiles(file.getAbsolutePath()); } else { //判断是文件的名字是否包含json if (file.getAbsolutePath().contains("json")) { try { //可以通过流读取json文件的内容,并转化为Map,在转化为实体类 log.info("{}","添加中"); }catch (Exception e){ //如果发生异常退出虚拟机并打印出现异常的文件 e.printStackTrace(); log.error("{}","添加数据出现异常的文件为:"+file.getAbsolutePath()); System.exit(0); } } } } } else { if (root.getAbsolutePath().contains("json")) { try { //可以通过流读取json文件的内容,并转化为Map,在转化为实体类 log.info("{}","添加中"); }catch (Exception e){ e.printStackTrace(); log.error("{}","添加数据出现异常的文件为:"+root.getAbsolutePath()); //如果发生异常退出虚拟机并打印出现异常的文件 System.exit(0); } } } }
二、利用Gson转化为map
对于还没有用过Gson的伙伴我觉的这一篇文章写的不错,可以阅读Gson的简单使用
下面就直接开搞了1
1.创建Gson对象
Gson gson = new GsonBuilder() .serializeNulls() //序列化null 可导出 .excludeFieldsWithoutExposeAnnotation() //@Expose 导出数据 .create();在转换Map的时候要在实体类的属性上加注解@SerializedName("year")@Exposeprivate String year;二.读取json文件的内容并将json文件中的json数据转化为MapBufferedReader bufferedReader = new BufferedReader(new FileReader(new File(filePath))); int line = 1; String context = null;String json = null;//json内容转化为Map集合通过遍历集合来进行封装 while ((context = bufferedReader.readLine()) != null) {//Context就是读到的json数据
json += context;
line++;
}//利用Gson对象将json数据转换为Map
//这就将Json转换为Map了.Map result = (Map)gson.fromJson(json, Map.class);
Student Student = gson.fromJson(json,Student.class);
//将json对象转化为了对象下来就要看你的怎么用了,在这里还会有许多问题因为你的json数据格式决定这你的Map里面的格式,但是我总结了一下碰到{}是转化为Map,碰到[]转化为List.所以在你的转化的Map中可能有Map,也可能有List.