當前位置:
首頁 >
前端技术
> javascript
>内容正文
javascript
JSON动态解析
JSON動態解析
- 問題的由來
在公司實習期間,遇到了這樣一個問題,就是動態去請求不同的API接口,去解析返回的JSON數據,并且得存儲到數據庫中。在知道json返回的數據類型,然后創建對應的pojo類,去解析json這樣的我們都容易操作,但是在不知道json返回數據字段情況下,如何實現動態解析并動態建表存儲,這個就難到我了。后面在掙扎了好久,終于找到了解決的辦法,現在就做個總結。
首先來看一下幾種類型的json數據
- 比較常見的 ,普通類型
- 復雜一點的,含有list的多條數據
接下來,我們就要去實現解析這兩種類型的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字符串轉換成jsonObjectJSONObject 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包,可自行百度下載,如有需要也可聯系我郵箱發送:
注意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 {@AutowiredDyinfoService 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-valueSystem.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內的mapSet<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套哦~
總結
- 上一篇: 小葵花妈妈课堂开课了~~~
- 下一篇: JAVA实现类泡泡屏保效果