JSON动态解析

本文涉及的产品
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
全局流量管理 GTM,标准版 1个月
云解析 DNS,旗舰版 1个月
简介: JSON动态解析

JSON动态解析

  • 问题的由来

在公司实习期间,遇到了这样一个问题,就是动态去请求不同的API接口,去解析返回的JSON数据,并且得存储到数据库中。在知道json返回的数据类型,然后创建对应的pojo类,去解析json这样的我们都容易操作,但是在不知道json返回数据字段情况下,如何实现动态解析并动态建表存储,这个就难到我了。后面在挣扎了好久,终于找到了解决的办法,现在就做个总结。

首先来看一下几种类型的json数据

  • 比较常见的 ,普通类型
{
    "rtnCode": "000000",
    "rtnMsg": "success",
    "data": {
        "name": "张丽花",
        "gender": "女",1
        "spell": " ", 1
        "birthday": "1985-05-16",    1
        "idCard": "352202198505XXXX",1
        "validDate": "",1
        "guideNum": "D-3522-001332",1
        "qualificationCode": "DZG2006JX12296",
        "randAndLanguage": " 普通话--初级    ",
        "nation": "汉族",1
        "tel": "13459300151",
        "organization": "宁德市旅游协会导游工作部门",
        "touristAdministration": "宁德市旅游发展委员会",
        "photo_front": "http://ossdev.12301e.com/upload_a137919f030f8458761d202c468f2c2c.jpg",1
        "photo_reverse": "http://ossdev.12301e.com/upload_f94f8ca17c9078a82180e4f99b4ce854.jpg",1
        "photo": "http://ossdev.12301e.com/upload_d790b665898f74c39e8515e645857d3a.jpg",1
        "result": "通过",1
        "approver": "关艳苹",  1
        "company": "宁德市旅游发展委员会"
    }
}
  • 复杂一点的,含有list的多条数据
{
    "rtnCode": "000000",
    "rtnMsg": "success",
    "data": {
        "totalPage": "1",
        "totalSize": "1",
        "list": [
            {
                "name": "张丽花",
                "idCard": "352202198505XXXX",
                "guideNum": "D-3522-001332",
                "gender": "女",
                "rank": "初级",
                "date": "2017-12-08",
                "approver": "关艳苹",
                "id": "1886351"
            }, {
                "name": "张丽花2",
                "idCard": "3522021985051XXXX",
                "guideNum": "D-3522-001332",
                "gender": "女",
                "rank": "初级",
                "date": "2017-12-08",
                "approver": "关艳苹",
                "id": "1886351"
            },{
                "name": "张丽花3",
                "idCard": "3522021985XXXX",
                "guideNum": "D-3522-001332",
                "gender": "女",
                "rank": "初级",
                "date": "2017-12-08",
                "approver": "关艳苹",
                "id": "1886351"
            }
        ]
    }
}

接下来,我们就要去实现解析这两种类型的json数据。

这里我提供了一个工具类,专门用来解析json字符串

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import com.fasterxml.jackson.databind.ObjectMapper;
import net.sf.json.JSONArray;
import net.sf.json.JSONObject;
/*
 * JsonUtils生成json数据和解析json数据
 */
public class JsonUtils {
  static ObjectMapper objectMapper;
  /*
   * Json字符串转 Object对象
   */
  public static <T> T fromJson(String content, Class<T> valueType) {
    if (objectMapper == null) {
      objectMapper = new ObjectMapper();
    }
    try {
      return objectMapper.readValue(content, valueType);
    } catch (Exception e) {
      e.printStackTrace();
    }
    return null;
  }
  /*
   * Object对象转 json字符串
   */
  public static String toJson(Object object) {
    if (objectMapper == null) {
      objectMapper = new ObjectMapper();
    }
    try {
      return objectMapper.writeValueAsString(object);
    } catch (Exception e) {
      e.printStackTrace();
    }
    return null;
  }
  /**
   * 将json格式的字符串解析成Map对象 json格式:{"name":"admin","retries":"3fff"}
   * 
   * @param object
   * @return
   */
  public Map<String, String> jsonToMap(Object object) {
    Map<String, String> data = new HashMap<String, String>();
    try {
      if(object!=null&&!object.equals("")){
        // 将json字符串转换成jsonObject
        JSONObject jsonObject = JSONObject.fromObject(object);
        Iterator<?> it = jsonObject.keys();
        // 遍历jsonObject数据,添加到Map对象
        while (it.hasNext()) {
          String key = String.valueOf(it.next());
          String value = (String) jsonObject.get(key).toString();
          data.put(key, value);
        }
      }
    } catch (Exception e) {
      e.printStackTrace();
    }
    return data;
  }
  /**
   * 将json格式的字符串解析成List-Map对象
   * json格式:[{"name":"admin","retries":"3fff"},{"name":"admin","retries":
   * "3fff"}]
   * 
   * @param object
   * @return
   */
  public List<Map<String, String>> jsonToList(Object object) {
    JSONArray arry = JSONArray.fromObject(object);
    List<Map<String, String>> rsList = new ArrayList<Map<String, String>>();
    for (int i = 0; i < arry.size(); i++) {
      JSONObject jsonObject = arry.getJSONObject(i);
      Map<String, String> map = new HashMap<String, String>();
      for (Iterator<?> iter = jsonObject.keys(); iter.hasNext();) {
        String key = (String) iter.next();
        String value = null;
        if(jsonObject.get(key)!=null){
          value = jsonObject.get(key).toString();
        }else{
          value = "";
        }       
        map.put(key, value);
      }
      rsList.add(map);
    }
    return rsList;
  }
}

使用的时候需要用到下面几个jar包,可自行百度下载,如有需要也可联系我邮箱发送:

20200401134307494.png

注意commons-collections使用3点几版本的,不要太高,不然会报错

测试工具类得使用

import java.util.List;
import java.util.Map;
import java.util.Set;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.hrt.json.JsonUtils;
import com.hrt.service.DyinfoService;
import net.sf.json.JSONObject;
@Service
public class TestJson {
  @Autowired
  DyinfoService dyinfoService;
  public static void main(String[] args) {
  String str1="{\r\n" + 
      "    \"rtnCode\": \"000000\",\r\n" + 
      "    \"rtnMsg\": \"success\",\r\n" + 
      "    \"data\": {\r\n" + 
      "        \"totalPage\": \"1\",\r\n" + 
      "        \"totalSize\": \"1\",\r\n" + 
      "        \"list\": [\r\n" + 
      "            {\r\n" + 
      "                \"name\": \"张丽花\",\r\n" + 
      "                \"idCard\": \"352202198505XXXX\",\r\n" + 
      "                \"guideNum\": \"D-3522-001332\",\r\n" + 
      "                \"gender\": \"女\",\r\n" + 
      "                \"rank\": \"初级\",\r\n" + 
      "                \"date\": \"2017-12-08\",\r\n" + 
      "                \"approver\": \"关艳苹\",\r\n" + 
      "                \"id\": \"1886351\"\r\n" + 
      "            }\r\n" + 
      "        ]\r\n" + 
      "    }\r\n" + 
      "}";
  String str2="{\r\n" + 
      "    \"rtnCode\": \"000000\",\r\n" + 
      "    \"rtnMsg\": \"success\",\r\n" + 
      "    \"data\": {\r\n" + 
      "        \"name\": \"张丽花\",\r\n" + 
      "        \"gender\": \"女\",\r\n" + 
      "        \"spell\": \" \",\r\n" + 
      "        \"birthday\": \"1985-05-16\",\r\n" + 
      "        \"idCard\": \"352202198505XXXX\",\r\n" + 
      "        \"validDate\": \"\",\r\n" + 
      "        \"guideNum\": \"D-3522-001332\",\r\n" + 
      "        \"qualificationCode\": \"DZG2006JX12296\",\r\n" + 
      "        \"randAndLanguage\": \" 普通话--初级    \",\r\n" + 
      "        \"nation\": \"汉族\",\r\n" + 
      "        \"tel\": \"13459300151\",\r\n" + 
      "        \"organization\": \"宁德市旅游协会导游工作部门\",\r\n" + 
      "        \"touristAdministration\": \"宁德市旅游发展委员会\",\r\n" + 
      "        \"photo_front\": \"http://ossdev.12301e.com/upload_a137919f030f8458761d202c468f2c2c.jpg\",\r\n" + 
      "        \"photo_reverse\": \"http://ossdev.12301e.com/upload_f94f8ca17c9078a82180e4f99b4ce854.jpg\",\r\n" + 
      "        \"photo\": \"http://ossdev.12301e.com/upload_d790b665898f74c39e8515e645857d3a.jpg\",\r\n" + 
      "        \"result\": \"通过\",\r\n" + 
      "        \"approver\": \"关艳苹\",\r\n" + 
      "        \"company\": \"宁德市旅游发展委员会\"\r\n" + 
      "    }\r\n" + 
      "}";
  String str3="{\r\n" + 
      "    \"rtnCode\": \"000000\",\r\n" + 
      "    \"rtnMsg\": \"success\",\r\n" + 
      "    \"data\": {\r\n" + 
      "        \"totalPage\": \"1\",\r\n" + 
      "        \"totalSize\": \"1\",\r\n" + 
      "        \"list\": [\r\n" + 
      "            {\r\n" + 
      "                \"name\": \"张丽花\",\r\n" + 
      "                \"idCard\": \"35220219850516XXXX\",\r\n" + 
      "                \"guideNum\": \"D-3522-001332\",\r\n" + 
      "                \"gender\": \"女\",\r\n" + 
      "                \"rank\": \"初级\",\r\n" + 
      "                \"date\": \"2017-12-08\",\r\n" + 
      "                \"approver\": \"关艳苹\",\r\n" + 
      "                \"id\": \"1886351\"\r\n" + 
      "            }, {\r\n" + 
      "                \"name\": \"张丽花2\",\r\n" + 
      "                \"idCard\": \"352202198505XXXX\",\r\n" + 
      "                \"guideNum\": \"D-3522-001332\",\r\n" + 
      "                \"gender\": \"女\",\r\n" + 
      "                \"rank\": \"初级\",\r\n" + 
      "                \"date\": \"2017-12-08\",\r\n" + 
      "                \"approver\": \"关艳苹\",\r\n" + 
      "                \"id\": \"1886351\"\r\n" + 
      "            }\r\n" + 
      "        ]\r\n" + 
      "    }\r\n" + 
      "}";
  String str4="{ \r\n" + 
      "    \"rtnCode\":\"000000\", \r\n" + 
      "    \"rtnMsg\":\"success\", \r\n" + 
      "    \"data\":{ \r\n" + 
      "        \"id\":\"984DAFA4B837457A86896FCE40DA187D\", \r\n" + 
      "        \"fzsaqscjdglj\":\"福州市安全生产监督管理局\", \r\n" + 
      "        \"list\":[ \r\n" + 
      "            { \r\n" + 
      "                \"id\":\"4695DB12B22D4944AE509990B0288175\", \r\n" + 
      "                \"fzsaqscjdglj\":\"鼓楼区安全生产监督管理局\" \r\n" + 
      "                 }, \r\n" + 
      "            { \r\n" + 
      "                \"id\":\"1B00C5F841134E1FBBFAE43DCA0AD6AE\", \r\n" + 
      "                \"fzsaqscjdglj\":\"台江区安全生产监督管理局\" \r\n" + 
      "                 }, \r\n" + 
      "            { \r\n" + 
      "                \"id\":\"4F609BE00DD049E9B67E8127FD4AAAB1\", \r\n" + 
      "                \"fzsaqscjdglj\":\"仓山区安全生产监督管理局\" \r\n" + 
      "                 }, \r\n" + 
      "            { \r\n" + 
      "                \"id\":\"6AC3975D50EA42158AA6C956DDF71D8D\", \r\n" + 
      "                \"fzsaqscjdglj\":\"马尾区安全生产监督管理局\" \r\n" + 
      "                 }, \r\n" + 
      "            { \r\n" + 
      "                \"id\":\"BE6142BAF13D42B08C41C53AEDBE97FB\", \r\n" + 
      "                \"fzsaqscjdglj\":\"晋安区安全生产监督管理局\" \r\n" + 
      "                 }, \r\n" + 
      "            { \r\n" + 
      "                \"id\":\"60924D35DE324BC5BE7EF7A7BD1C7E9B\", \r\n" + 
      "                \"fzsaqscjdglj\":\"闽侯县安全生产监督管理局\" \r\n" + 
      "                 }, \r\n" + 
      "            { \r\n" + 
      "                \"id\":\"8FE3B90CB6B34248A4EA7CCD740923E7\", \r\n" + 
      "                \"fzsaqscjdglj\":\"连江县安全生产监督管理局\" \r\n" + 
      "                 }, \r\n" + 
      "            { \r\n" + 
      "                \"id\":\"DD72643D8B55428EBDA686F186011016\", \r\n" + 
      "                \"fzsaqscjdglj\":\"罗源县安全生产监督管理局\" \r\n" + 
      "                 }, \r\n" + 
      "            { \r\n" + 
      "                \"id\":\"5014816A8D0E445DBEF144F986436C21\", \r\n" + 
      "                \"fzsaqscjdglj\":\"闽清县安全生产监督管理局\" \r\n" + 
      "                 }, \r\n" + 
      "            { \r\n" + 
      "                \"id\":\"2FE491E25E7B46408DF5A9036BAADDBD\", \r\n" + 
      "                \"fzsaqscjdglj\":\"永泰县安全生产监督管理局\" \r\n" + 
      "                 }, \r\n" + 
      "            { \r\n" + 
      "                \"id\":\"B8AF0FB8F1C84EFBADBF5CD353A3C175\", \r\n" + 
      "                \"fzsaqscjdglj\":\"福清市安全生产监督管理局\" \r\n" + 
      "                 }, \r\n" + 
      "            { \r\n" + 
      "                \"id\":\"D7EE9BD5365343EE83A4BDD55C55E2BB\", \r\n" + 
      "                \"fzsaqscjdglj\":\"长乐市安全生产监督管理局\" \r\n" + 
      "                 } \r\n" + 
      "           ] \r\n" + 
      "     } \r\n" + 
      "}";
  toJson(str3);
  }
  //json解析
  public static void toJson(String str) {
    JsonUtils t=new JsonUtils(); 
    //1。首先解析成一个map集合###并遍历输出含有字段及字段对应的值  key-value
    System.out.println("第1:首先解析成一个map集合并遍历输出含有的字段");
      Map<String,String> p1=  t.jsonToMap(str);
      Set<String> keys=p1.keySet(); //获取map集合内所有字段
      for(String a:keys) {
        System.out.println("key:"+a+"  ,value:"+p1.get(a));
      }
      //2. 获取data数据,及获取map集合内的data字段,再解析###data内字段
      System.out.println("第2: 获取data数据,及获取map集合内的data字段,再解析data内字段");
      String data2=   p1.get("data"); //获取到data内的内容
      Map<String,String> p2=  t.jsonToMap(data2); //将data内的内容转map集合
      Set<String> keys2=p2.keySet();获取data内所有字段
      for(String a:keys2) {
        System.out.println("key:"+a+"  ,value:"+p2.get(a));
      }
      //普通的解析,用到1,2 就可以了
      //第3.解析list,获取到p2里的list字段的value,然后转换为 List<Map<key,value>>  ,这里的list字段得提供
      System.out.println("第3:.解析list,获取到p2里的list字段的value,然后转换为 List<Map<key,value>>");
      if(p2.containsKey("list")) { //判断是否含有list字段
         String list=   p2.get("list"); //获取到data内的内容
         List<Map<String, String>> p3=  t.jsonToList(list);   //调用工具类方法,然后转换为 List<Map<key,value>> 
         for(int i=0;i<p3.size();i++) {  //遍历输出
         Map<String,String> m3=  p3.get(i); //遍历list内的map
         Set<String> keys3=m3.keySet();获取map内的对象所有字段
         for(String a:keys3) { 
           System.out.println("key:"+a+"  ,value:"+m3.get(a));
         }
       } 
     }
  }
}

解析结果如下:

第1:首先解析成一个map集合###并遍历输出含有的字段
key:data  ,value:{"totalPage":"1","totalSize":"1","list":[{"name":"张丽花","idCard":"3522021985051XXXX","guideNum":"D-3522-001332","gender":"女","rank":"初级","date":"2017-12-08","approver":"关艳苹","id":"1886351"},{"name":"张丽花2","idCard":"3522021985051XXXX","guideNum":"D-3522-001332","gender":"女","rank":"初级","date":"2017-12-08","approver":"关艳苹","id":"1886351"}]}
key:rtnMsg  ,value:success
key:rtnCode  ,value:000000
第2: 获取data数据,及获取map集合内的data字段,再解析###data内字段
key:totalSize  ,value:1
key:totalPage  ,value:1
key:list  ,value:[{"name":"张丽花","idCard":"35220219850516XXXX","guideNum":"D-3522-001332","gender":"女","rank":"初级","date":"2017-12-08","approver":"关艳苹","id":"1886351"},{"name":"张丽花2","idCard":"352202198505XXXX","guideNum":"D-3522-001332","gender":"女","rank":"初级","date":"2017-12-08","approver":"关艳苹","id":"1886351"}]
第3:.解析list,获取到p2里的list字段的value,然后转换为 List<Map<key,value>>
key:date  ,value:2017-12-08
key:approver  ,value:关艳苹
key:gender  ,value:女
key:guideNum  ,value:D-3522-001332
key:idCard  ,value:3522021985051XXXX
key:name  ,value:张丽花
key:rank  ,value:初级
key:id  ,value:1886351
key:date  ,value:2017-12-08
key:approver  ,value:关艳苹
key:gender  ,value:女
key:guideNum  ,value:D-3522-001332
key:idCard  ,value:352202198XXXX
key:name  ,value:张丽花2
key:rank  ,value:初级
key:id  ,value:1886351

解析字段完成了,接下来就是对应着去实现动态建表的方法及存储的方法。

有兴趣的老爷,可以关注我的公众号【一起收破烂】,回复【006】获取2021最新java面试资料以及简历模型120套哦~




相关文章
|
2月前
|
SQL 存储 JSON
SQL,解析 json
SQL,解析 json
80 8
|
4月前
|
存储 JSON API
淘系API接口(解析返回的json数据)商品详情数据解析助力开发者
——在成长的路上,我们都是同行者。这篇关于商品详情API接口的文章,希望能帮助到您。期待与您继续分享更多API接口的知识,请记得关注Anzexi58哦! 淘宝API接口(如淘宝开放平台提供的API)允许开发者获取淘宝商品的各种信息,包括商品详情。然而,需要注意的是,直接访问淘宝的商品数据API通常需要商家身份或开发者权限,并且需要遵循淘宝的API使用协议。
淘系API接口(解析返回的json数据)商品详情数据解析助力开发者
|
3月前
|
JSON API 数据格式
requests库中json参数与data参数使用方法的深入解析
选择 `data`或 `json`取决于你的具体需求,以及服务器端期望接收的数据格式。
303 2
|
3月前
|
JSON 前端开发 JavaScript
解析JSON文件
解析JSON文件
152 9
|
2月前
|
JSON JavaScript API
商品详情数据接口解析返回的JSON数据(API接口整套流程)
商品详情数据接口解析返回的JSON数据是API接口使用中的一个重要环节,它涉及从发送请求到接收并处理响应的整个流程。以下是一个完整的API接口使用流程,包括如何解析返回的JSON数据:
|
3月前
|
存储 JSON API
Python编程:解析HTTP请求返回的JSON数据
使用Python处理HTTP请求和解析JSON数据既直接又高效。`requests`库的简洁性和强大功能使得发送请求、接收和解析响应变得异常简单。以上步骤和示例提供了一个基础的框架,可以根据你的具体需求进行调整和扩展。通过合适的异常处理,你的代码将更加健壮和可靠,为用户提供更加流畅的体验。
211 0
|
4月前
|
JSON API 数据格式
基于服务器响应的实时天气数据进行JSON解析的详细代码及其框架
【8月更文挑战第25天】这段资料介绍了一个使用Python从服务器获取实时天气数据并解析JSON格式数据的基本框架。主要分为三个部分:一是安装必要的`requests`库以发起HTTP请求获取数据,同时利用Python内置的`json`库处理JSON数据;二是提供了具体的代码实现,包括获取天气数据的`get_weather_data`函数和解析数据的`parse_weather_data`函数;三是对代码逻辑进行了详细说明,包括如何通过API获取数据以及如何解析这些数据来获取温度和天气描述等信息。用户需要根据实际使用的天气API调整代码中的API地址、参数和字段名称。
|
1月前
|
监控 Java 应用服务中间件
高级java面试---spring.factories文件的解析源码API机制
【11月更文挑战第20天】Spring Boot是一个用于快速构建基于Spring框架的应用程序的开源框架。它通过自动配置、起步依赖和内嵌服务器等特性,极大地简化了Spring应用的开发和部署过程。本文将深入探讨Spring Boot的背景历史、业务场景、功能点以及底层原理,并通过Java代码手写模拟Spring Boot的启动过程,特别是spring.factories文件的解析源码API机制。
77 2
|
3天前
|
存储 设计模式 算法
【23种设计模式·全精解析 | 行为型模式篇】11种行为型模式的结构概述、案例实现、优缺点、扩展对比、使用场景、源码解析
行为型模式用于描述程序在运行时复杂的流程控制,即描述多个类或对象之间怎样相互协作共同完成单个对象都无法单独完成的任务,它涉及算法与对象间职责的分配。行为型模式分为类行为模式和对象行为模式,前者采用继承机制来在类间分派行为,后者采用组合或聚合在对象间分配行为。由于组合关系或聚合关系比继承关系耦合度低,满足“合成复用原则”,所以对象行为模式比类行为模式具有更大的灵活性。 行为型模式分为: • 模板方法模式 • 策略模式 • 命令模式 • 职责链模式 • 状态模式 • 观察者模式 • 中介者模式 • 迭代器模式 • 访问者模式 • 备忘录模式 • 解释器模式
【23种设计模式·全精解析 | 行为型模式篇】11种行为型模式的结构概述、案例实现、优缺点、扩展对比、使用场景、源码解析
|
3天前
|
设计模式 存储 安全
【23种设计模式·全精解析 | 创建型模式篇】5种创建型模式的结构概述、实现、优缺点、扩展、使用场景、源码解析
结构型模式描述如何将类或对象按某种布局组成更大的结构。它分为类结构型模式和对象结构型模式,前者采用继承机制来组织接口和类,后者釆用组合或聚合来组合对象。由于组合关系或聚合关系比继承关系耦合度低,满足“合成复用原则”,所以对象结构型模式比类结构型模式具有更大的灵活性。 结构型模式分为以下 7 种: • 代理模式 • 适配器模式 • 装饰者模式 • 桥接模式 • 外观模式 • 组合模式 • 享元模式
【23种设计模式·全精解析 | 创建型模式篇】5种创建型模式的结构概述、实现、优缺点、扩展、使用场景、源码解析

热门文章

最新文章

推荐镜像

更多