动态解析Json数据插入数据库

需求:动态获取其他网站的数据,获取得到的数据是json格式数据,数据格式不定,所以得动态生成数据表将数据插入数据库,使用框架为mybatis

列表数据如下

{
    "rtnCode": "000000",
    "rtnMsg": "success",
    "data": {
        "totalPage": "1",
        "totalSize": "1",
        "list": [
            {
                "name": "xxx",
                "idCard": "35xxxxxxxxxxxxxxxx",
                "guideNum": "D-3522-001332",
                "gender": "女",
                "rank": "初级",
                "date": "2017-12-08",
                "approver": "xxx",
                "id": "1886351"
            }
        ]
    }
}

详情数据如下

{
    "rtnCode": "000000",
    "rtnMsg": "success",
    "data": {
        "name": "xxx",
        "gender": "女",
        "spell": " ",
        "birthday": "1991-05-12",
        "idCard": "35xxxxxxxxxxxxxxxxxxxx",
        "validDate": "",
        "guideNum": "D-3522-001332",
        "qualificationCode": "DZG2006JXXXX",
        "randAndLanguage": " 普通话--初级    ",
        "nation": "汉族",
        "tel": "134xxxxxxxx",
        "organization": "xx市旅游协会导游工作部门",
        "touristAdministration": "xx市旅游发展委员会",
        "photo_front": "http://xxx.com/upload_a137919f030f8458761d202c468f2c2c.jpg",
        "photo_reverse": "http://xxx.com/upload_f94f8ca17c9078a82180e4f99b4ce854.jpg",
        "photo": "http://xxx.com/upload_d790b665898f74c39e8515e645857d3a.jpg",
        "result": "通过",
        "approver": "xxx",
        "company": "xx市旅游发展委员会"
    }
}

解析Json(请求到的数据假设最多只有三级,只处理到三级)

String st =  Post.sendHtpps("aaaaaa",taskConfig.getTask_api());
          if(st!=null) {
               JSONObject json1 =  JSONObject.parseObject(st);
           String code=json1.getString("rtnCode");
           if("900003".equals(code)) {
                String rtnCode="";
                String rtn="";
                for(int i=0;i<3;i++) {
                     rtn=loginConfigService.requestLoginConfig(taskConfig.getLogin_config_id());
                     if(rtn!=null) {
                          JSONObject json =  JSONObject.parseObject(rtn);
                       //获取item,得到json数组
                      rtnCode=json.getString("rtnCode");
                      System.out.println("正在重新登录。。。"+rtnCode);
                      if("000000".equals(rtnCode)) {
                           task(taskConfig);
                           break;
                      }
                     }
                }
           }
               else {
                    if ("900005".equals(code)) {
                         System.out.println("未查询到数据");
                    } else if ("000000".equals(code)) {
                         JsonUtils t = new JsonUtils();
                         Map<String, String> p1 =  t.jsonToMap(st);
                         System.out.println("这是获取到的数据:" + st);
                         String data2 = p1.get("data"); //  获取到data内的内容
                         Map<String, String> p2 =  t.jsonToMap(data2); // 将data内的内容转map集合
                         
                         if (p2.containsKey("list")) {// 如果json中包含list,则调用sqListService方法
                              String list = p2.get("list");  // 获取到list内的内容
                              List<Map<String, String>> p3 =  t.jsonToList(list);// 将list内容转换成List<Map>格式数据
                              String list_id =  UUIDUtils.getCode();
                              p2.put("list_id", list_id);
                              p2.remove("list");
                              p2.put("table_name", "SqList_"  + taskConfig.getTask_id());
                              for (Map<String, String> l :  p3) {
                                   l.put("list_id",  list_id);
                                   l.put("table_name",  "SqList_" + taskConfig.getTask_id() + "_list");
                              }
                              int row =  sqListService.createTable(p2, p3);
                              if (row == 0) {
                                   sqListService.addList(p2,  p3);
                              }
                         } else {// 如果json中不包含list,则调用dyinfoService方法
                              p2.put("table_name", "Dyinfo_"  + taskConfig.getTask_id());
                              int w =  dyinfoService.createNewTable(p2);
                              if (w == 0) {
                                   dyinfoService.insertData(p2);
                              }
                         }
                    }else {
                         System.out.println("请求超时");
                    }
               }

//Json解析核心内容
public void toJsonData(String str) {
       JsonUtils t=new JsonUtils();
      Map<String,String> p1=  t.jsonToMap(str);
      String data2=   p1.get("data"); //获取到data内的内容
      Map<String,String> p2=  t.jsonToMap(data2); //将data内的内容转map集合
     if(p2.containsKey("list")) {
         String list=   p2.get("list"); //获取到data内的内容
         List<Map<String, String>> p3=  t.jsonToList(list);
     }else {
       dyinfoService.add(p2);
     }
  }

列表数据动态建表插入SqList.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
       PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
       "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
       <mapper namespace="com.hrt.mapper.SqListMapper">
       
             <update id="createTable_data" parameterType="java.util.Map">  
               CREATE TABLE IF NOT EXISTS ${dataMap.get("table_name")}
                <foreach collection="dataMap.keys" separator=" varchar(255),"  item="key" open="(" close=" varchar(255))">
                   <if test="key != 'table_name'">
                      ${key}
                   </if>
                </foreach>
           </update>
             <update id="createTable_list" parameterType="java.util.List">  
               CREATE TABLE IF NOT EXISTS ${list.get(0).get("table_name")}
               <if test="list.size > 0">
                      <foreach collection="list.get(0).keys" separator="  varchar(255)," item="key" open="(sid int NOT NULL AUTO_INCREMENT," close="  varchar(255),PRIMARY KEY (sid))">
                         <if test="key != 'table_name'">
                            ${key}
                         </if>
                      </foreach>
                </if>
           </update>
           
           <insert id="insertData" parameterType="java.util.Map">
               insert into ${dataMap.get("table_name")}
               <foreach collection="dataMap.keys" separator="," item="key"  open="(" close=")">
                  <if test="key != 'table_name'">
                ${key}
               </if>
               </foreach>
               values
               <foreach collection="dataMap.keys" item="key" separator=","  open="(" close=")">
                   <if test="key != 'table_name'">
                        #{dataMap[${key}]} 
                     </if>
               </foreach>
       </insert>
       
            <insert id="addList" parameterType="java.util.List">
              insert into ${list.get(0).get("table_name")}
              <if test="list.size > 0">
                    <foreach collection="list.get(0).keys" separator=","  item="key" open="(" close=")">
                        <if test="key != 'table_name'">
                       ${key}
                      </if>
                     </foreach>
                    values
                    <foreach collection="list" item="sq" index="index"  separator=",">
                           <foreach collection="list.get(index).keys" item="key"  separator="," open="("  close=")">
                              <if test="key != 'table_name'">
                             #{sq.${key}}
                            </if>
                           </foreach>
                    </foreach>
              </if>
           </insert>
       </mapper>

SqListMapper.java

public interface SqListMapper {
      public void add(Map<String, String> map);
      int insertData(@Param("dataMap") Map<String, String>  dataMap);
      int addList(List<Map<String,String>> list);
      int createTable_data(@Param("dataMap") Map<String,  String> dataMap);
      int createTable_list(List<Map<String, String>>  list);
}

SqListService.java

public interface SqListService {
      /**
       *
      * @Title: addList
      * @Description: TODO
      * @param @param list
      * @return void
      * @throws
       */
      int addList(Map<String, String>  dataMap,List<Map<String,String>> list);
      /**
       *
      * @Title: createTable
      * @Description: TODO 创建数据表
      * @param @param dataMap
      * @param @param list
      * @param @return
      * @return int
      * @throws
       */
      int createTable(Map<String, String>  dataMap,List<Map<String, String>> list);
}

SqListServiceImpl.java

@Service("sqListService")
public class SqListServiceImpl  implements SqListService{
     @Autowired
     SqListMapper sqListMapper;
     @Override
     public int addList(Map<String, String>  p2,List<Map<String, String>> list) {
          // TODO Auto-generated method stub
          int m=sqListMapper.insertData(p2);
          int n=sqListMapper.addList(list);
          return m+n;
     }
     public int createTable(Map<String, String>  dataMap,List<Map<String, String>> list) {
          int m=sqListMapper.createTable_data(dataMap);
          int n=sqListMapper.createTable_list(list);
          return m+n;
     }
}

详情数据动态建表插入Dyinfo.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
       PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
       "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
       <mapper namespace="com.hrt.mapper.DyinfoMapper">
           <update id="createNewTable" parameterType="java.util.Map">  
               CREATE TABLE IF NOT EXISTS ${dataMap.get("table_name")}
                <foreach collection="dataMap.keys" separator=" varchar(255),"  item="key" open="(id int(11) NOT NULL AUTO_INCREMENT," close="  varchar(255),PRIMARY KEY (id))">
                   <if test="key != 'table_name'">
                      ${key}
                   </if>
                </foreach>
           </update>
           <insert id="insertData" parameterType="java.util.Map">
               insert into ${dataMap.get("table_name")}
               <foreach collection="dataMap.keys" separator="," item="key"  open="(" close=")">
                   <if test="key != 'table_name'">
                      ${key}
                   </if>
               </foreach>
               values
               <foreach collection="dataMap.keys" item="key" separator=","  open="(" close=")">
                   <if test="key != 'table_name'">
                      #{dataMap[${key}]}
                   </if>
               </foreach>
       </insert>        
       </mapper>

DyinfoMapper.java

public interface DyinfoMapper {
int insertData(@Param("dataMap") Map<String, String>  dataMap);
int createNewTable(@Param("dataMap") Map<String, String>  dataMap);
}

DyinfoServiceImpl.java

public class DyinfoServiceImpl  implements DyinfoService{
     @Autowired
     DyinfoMapper dyinfoMapper;
     @Override
     public int insertData(Map<String, String> p2) {
          // TODO Auto-generated method stub
          int n=dyinfoMapper.insertData(p2);
          return n;
     }
     @Override
     public int createNewTable(Map<String, String>  dataMap) {
          // TODO Auto-generated method stub
          return dyinfoMapper.createNewTable(dataMap);
     }
}

DyinfoService.java

public interface DyinfoService {
     /**
     * @Title: insertData
     * @Description: TODO
     * @param @param p2
     * @return void
     * @throws
     */
     int insertData(Map<String, String> p2);
     /**
      *
     * @Title: createNewTable
     * @Description: TODO
     * @param @param dataMap
     * @param @return
     * @return int
     * @throws
      */
     int createNewTable(Map<String, String> dataMap);
}

存储效果
通过list_+时间来生成表名
表内数据

注:为了避免数据回滚,利用spring的特性,将可能会回滚的操作放在一个方法里面,可实现同时回滚。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值