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