日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

简单的JSON解析工具

發(fā)布時(shí)間:2023/12/10 javascript 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 简单的JSON解析工具 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

一、背景

最近領(lǐng)導(dǎo)新給了一個(gè)需求,需要前臺(tái)傳一段正確的json串,經(jīng)過解析以后能把層級(jí)關(guān)系正確的存入數(shù)據(jù)庫(kù)。先看看前端成果物:

二、需求分析

? ? ? ? 1、要求是一段正確的json串(符合json格式的字符串),所以要考慮用戶可能輸入任意的字符串 => 所以需要對(duì)輸入的字符串進(jìn)行捕獲,不符合的情況下彈出警告框提示用戶。

? ? ? ? 2、對(duì)于符合json格式的字符串怎么去格式化校驗(yàn),是一個(gè)難題。如果不借助官方現(xiàn)成的工具,當(dāng)時(shí)想到的是通過字符串中的 { 和 [ 去分析層級(jí)關(guān)系,沒遇到 { 或 [ 層級(jí)關(guān)系就應(yīng)該遞加一層,沒遇到 } 或 ]?就減少一層。但是其中有很多細(xì)節(jié)是需要考究的,比如在json串的鍵值對(duì)中,可能會(huì)出現(xiàn)? "list": []? ? ? ? "name": {}? ? ? ? "list": [{}] 這種情況,此時(shí)去遞加層級(jí)關(guān)系大可不必!下面是我的一些思路,當(dāng)時(shí)有根據(jù)這個(gè)思路做了幾版代碼。但是最終都沒有完美的實(shí)現(xiàn)!有興趣的可以參考或者指出問題一起探討,哈哈哈哈哈哈

public void commonJSONParse(String jsonStr) {char[] specialArr = { '\'', '"', '\\' }; //包含此類字符時(shí),不執(zhí)行邏輯List<Character> specialList = CollectionUtils.arrayToList(specialArr);int level = 0;Map<Integer, Integer> map = new TreeMap<>(); //key儲(chǔ)存索引,value儲(chǔ)存層級(jí)關(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)了一個(gè)現(xiàn)成方法可以進(jìn)行json串的格式化校驗(yàn)

formatJson() {try {//jptextarea是文本框的值,用于接收你寫入的json串//JSON.stringify()通過設(shè)置第二第三參數(shù)值可以到達(dá)校驗(yàn)的目的//第三個(gè)參數(shù)決定校驗(yàn)后的空格數(shù)//需要注意的是文本框中只是一個(gè)符合json格式的字符串,所以必須先經(jīng)過JSON.parse()解析為//對(duì)象才能調(diào)用JSON.stringifythis.jPTextarea = JSON.stringify(JSON.parse(this.jPTextarea), null, 4);} catch (error) {console.error(error);this.showCommonAlert("JSON格式錯(cuò)誤!請(qǐng)規(guī)范!");}},

三、后端實(shí)現(xiàn)

? ? ? ? 以上是js實(shí)現(xiàn)方式,后端實(shí)現(xiàn)方式也寫了幾個(gè)版本,但是最后發(fā)現(xiàn)還是遞歸比較好用。沒想到有更好的方式,因?yàn)閖son串里的層級(jí)關(guān)系可以無限嵌套,第一時(shí)間想到的就是遞歸來做。遞歸的話,說下我的思路:

? ? ? ? 1、根據(jù)json串首字母是 { 或 [ 來判斷此json串本質(zhì)是一個(gè)集合類型還是對(duì)象類型。

? ? ? ? 2、對(duì)象類型使用阿里巴巴的fastjson包下的JSONObject.parse()解析,解析后返回的是一個(gè)可以轉(zhuǎn)成map類型的Object對(duì)象;同理JSONArray.parse()用于解析集合也是。

? ? ? ? 3、通過JSONArray.parse()返回可以轉(zhuǎn)成JSONArray類型的對(duì)象后,在循環(huán)拿取里面的JSONObject類型的對(duì)象,所以不管是集合還是對(duì)象類型,最終都可以轉(zhuǎn)成對(duì)象類型來做。

? ? ? ? 4、遞歸的條件就是,每次碰上JSONObject就執(zhí)行遞歸,因?yàn)楹蠖诉壿嫴灰粯?#xff0c;這里就不附上代碼!

總結(jié)

以上是生活随笔為你收集整理的简单的JSON解析工具的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。