javascript
简单的JSON解析工具
一、背景
最近領導新給了一個需求,需要前臺傳一段正確的json串,經過解析以后能把層級關系正確的存入數據庫。先看看前端成果物:
二、需求分析
? ? ? ? 1、要求是一段正確的json串(符合json格式的字符串),所以要考慮用戶可能輸入任意的字符串 => 所以需要對輸入的字符串進行捕獲,不符合的情況下彈出警告框提示用戶。
? ? ? ? 2、對于符合json格式的字符串怎么去格式化校驗,是一個難題。如果不借助官方現成的工具,當時想到的是通過字符串中的 { 和 [ 去分析層級關系,沒遇到 { 或 [ 層級關系就應該遞加一層,沒遇到 } 或 ]?就減少一層。但是其中有很多細節是需要考究的,比如在json串的鍵值對中,可能會出現? "list": []? ? ? ? "name": {}? ? ? ? "list": [{}] 這種情況,此時去遞加層級關系大可不必!下面是我的一些思路,當時有根據這個思路做了幾版代碼。但是最終都沒有完美的實現!有興趣的可以參考或者指出問題一起探討,哈哈哈哈哈哈
public void commonJSONParse(String jsonStr) {char[] specialArr = { '\'', '"', '\\' }; //包含此類字符時,不執行邏輯List<Character> specialList = CollectionUtils.arrayToList(specialArr);int level = 0;Map<Integer, Integer> map = new TreeMap<>(); //key儲存索引,value儲存層級關系char[] charArr = jsonStr.toCharArray();for (int i = 0; i < charArr.length; i++) {char cunrretChar = charArr[i];int index = specialList.indexOf(Character.valueOf(cunrretChar));if (index == -1) {switch (cunrretChar) {case '{':map.put(i, ++level);break;case '}':map.put(i, level--);break;case '[':map.put(i, ++level);break;case ']':map.put(i, level--);break;default:break;}}}for (Integer key : map.keySet()) {System.out.println(key + ": " + map.get(key) + "=>" + jsonStr.charAt(key.intValue()));}for (Integer key : map.keySet()) {}}3、解決辦法
? ? ? ? 最終在網上是發現了一個現成方法可以進行json串的格式化校驗
formatJson() {try {//jptextarea是文本框的值,用于接收你寫入的json串//JSON.stringify()通過設置第二第三參數值可以到達校驗的目的//第三個參數決定校驗后的空格數//需要注意的是文本框中只是一個符合json格式的字符串,所以必須先經過JSON.parse()解析為//對象才能調用JSON.stringifythis.jPTextarea = JSON.stringify(JSON.parse(this.jPTextarea), null, 4);} catch (error) {console.error(error);this.showCommonAlert("JSON格式錯誤!請規范!");}},三、后端實現
? ? ? ? 以上是js實現方式,后端實現方式也寫了幾個版本,但是最后發現還是遞歸比較好用。沒想到有更好的方式,因為json串里的層級關系可以無限嵌套,第一時間想到的就是遞歸來做。遞歸的話,說下我的思路:
? ? ? ? 1、根據json串首字母是 { 或 [ 來判斷此json串本質是一個集合類型還是對象類型。
? ? ? ? 2、對象類型使用阿里巴巴的fastjson包下的JSONObject.parse()解析,解析后返回的是一個可以轉成map類型的Object對象;同理JSONArray.parse()用于解析集合也是。
? ? ? ? 3、通過JSONArray.parse()返回可以轉成JSONArray類型的對象后,在循環拿取里面的JSONObject類型的對象,所以不管是集合還是對象類型,最終都可以轉成對象類型來做。
? ? ? ? 4、遞歸的條件就是,每次碰上JSONObject就執行遞歸,因為后端邏輯不一樣,這里就不附上代碼!
總結
以上是生活随笔為你收集整理的简单的JSON解析工具的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: linux中mysql与eclipse_
- 下一篇: memcached 使用 java_ja