我個人主要是做一些后端的工作,比如php、python、c之類的,c比較少,最主要的是php,不過我非常喜歡js,所以經常會愿意去寫一些小玩意自娛自樂。
今天在測試接口的時候,使用原生js的XMLHttpRequest去請求,直接使用document….innerHTML輸出到頁面,因為沒有瀏覽器的json格式化沒有生效,所以接口響應的json數據就看起來很不舒服。
于是乎,我就想起了為啥我自己不能實現一個,應該不是很難吧。
我仔細思考了一下,這玩意不就是遇到大括號、中括號和中括號就換行嗎,每行還有個縮進,人家再高級一點的還有顏色,折疊功能、縮進對齊線之類的,于是我覺得一步一步來,先把格式化和顏色實現出來,后面的折疊、動畫和縮進對齊線再慢慢做。
電影有句話說的好啊:“步子邁大了,咔,容易扯著蛋”。
扯了這老些沒用的,下面開始我的正經思路:
合法的JSON字符串是一個單行字符串,邊界符號是“{} []”,鍵值對之間是以英文逗號“,”作為分隔,鍵和值之間是用英文冒號“:”進行分隔。JSON內的字符串必須以雙引號包括在外側,數字類型或布爾類型可以不使用雙引號包括。逗號分隔符的后面必須至少存在一個鍵值對(即末尾的鍵值對的后面不能有逗號分隔符了,這里的逗號指的是鍵值對分隔符,而不是指值內的逗號字符串)。
看看別人優秀的是什么樣子的。
從某平臺的json格式化服務截取
可以發現在“{, [”的后面都會有一個換行,每個鍵值對的后面都有一個換行,在符號“], 和 }, ”的后面都會有一個換行。
而且格式化后的JSON是有“結構區塊”的,從縮進來區分不同的結構塊,這一點有點像python,不過這有點牽強,格式化這樣做的目的是為了能夠很清晰的查看JSON的結構,與python的目的是有本質的區別的。
從截圖來看,只要遇到一個“{ 或 [”,就要出現縮進,而且可以看出,縮進是隨著遇到的個數增加的,這是成正比啊。而且只要遇到“]或}”,縮進就要少一個。
說到這里是不是就有感覺了,縮進就是在匹配括號啊,這匹配括號在逆波蘭式里的操作啊,不就是基礎的數據結構“?!眴?。
那我對整個字符串進行遍歷判斷是不就能做到了,那有了思路就可以動手了,能動手我就不在這里扯?了。
<!-- 這里在頁面放一個pre標簽,讓輸入的結構按照我們需要的形式展現 --><pre ></pre>
假設我有一個jsonStr,我想要格式化它。
var jsonStr = '{"state":{"code":0,"success":true,"ok":1},"body":[{"count":2394,"dbName":"star_all"},{"count":133,"dbName":"star"},{"count":7,"dbName":"zy"},{"count":1,"dbName":"gordon_test"}]}';
function format(str){ var stack = []; //棧-用于括號匹配 var tmpStr = ''; //新格式化JSON字符串 var len = str.length; //原始JSON長度 //遍歷每一個字符 for (let i = 0; i < len; i++) { //當遇到結構塊起始結構 if (str[i] == '{' || str[i] === '[') { //起始結構后面直接換行 tmpStr += str[i] + "n"; //入棧 stack.push(str[i]); //這里的意思是結構塊起始的下一行開始就會有一個縮進,縮進量與遇到的結構塊起始符個數成正比1:1 tmpStr += "t".repeat(stack.length); } //當遇到結構塊結束符 else if (str[i] == ']' || str[i] === '}') { //因為本身JSON格式是固定的,所以括號一定是成對的,這里先不考慮錯誤的json數據 //遇到結束符就退棧, stack.pop(); //結束符本身輸出到下一行,并減少一個縮進 tmpStr += "n"+"t".repeat(stack.length) + str[i]; } //當遇到逗號的時候 else if (str[i] == ',') { //逗號后方直接換行,以及下一行的縮進處理 tmpStr += str[i] + "n" + "t".repeat(stack.length); } else { //其他字符直接復制 tmpStr += str[i]; } } return tmpStr;}
返回的數據放到<pre>標簽內
document.querySelector('#json').innerHTML = format(jsonStr);
輸出的效果如下圖
制表符t稍微有點遠,當然使用4個 也可以,別糾結~
這黑白色的不美觀,那就給上個色唄,看看人家的,括號一個顏色,鍵值對一個顏色,值一個顏色,我不能抄它的,我覺得字符串,數字、布爾都分別用一種顏色就行,這個實現就都能實現了。
那既然需要分開使用不同的顏色,那么必然就涉及CSS了,每個結構就得有HTML結構了,我直接用正則是不是就解決了。
先寫個CSS樣式把
.bold{ font-weight: 900;}.string-color { color: darkred;}.token { color: darkgreen;}.number { color: green;}.bool { color: orange;}
//使用捕獲,匹配全部的邊界符號,class使用tokentmpStr = tmpStr.replace(/([{[]}])/g, '<span >$1</span>');//使用零寬斷言和捕獲,匹配全部的兩側是雙引號的字符串,class使用stringtmpStr = tmpStr.replace(/(?<=")(w+)(?=")/g, '<span >$1</span>');//使用零寬斷言,匹配全部的前面位置是冒號,后面是逗號或換行的數字類型值tmpStr = tmpStr.replace(/(?<=:)(d+)(?=[,n])/g, '<span >$1</span>');//同理匹配布爾,tmpStr = tmpStr.replace(/(?<=:)(true|false)(?=[,n])/g, '<span >$1</span>');
零寬斷言就是匹配一個位置,分負向零寬斷言和正向零寬斷言,不知道的可以搜索一下。
效果還行
到這里就初步完成了一個還算能入眼的基礎JSON格式化小方法。后續再加個閃電爆炸的特效,下次再分享~
本文由 貴州做網站公司 整理發布,部分圖文來源于互聯網,如有侵權,請聯系我們刪除,謝謝!
網絡推廣與網站優化公司(網絡優化與推廣專家)作為數字營銷領域的核心服務提供方,其價值在于通過技術手段與策略規劃幫助企業提升線上曝光度、用戶轉化率及品牌影響力。這...
在當今數字化時代,公司網站已成為企業展示形象、傳遞信息和開展業務的重要平臺。然而,對于許多公司來說,網站建設的價格是一個關鍵考量因素。本文將圍繞“公司網站建設價...
在當今的數字化時代,企業網站已成為企業展示形象、吸引客戶和開展業務的重要平臺。然而,對于許多中小企業來說,高昂的網站建設費用可能會成為其發展的瓶頸。幸運的是,隨...
CC英語CC是什么意思?TO: to.(寫信給某某)CC:抄送,意思是給寫信給某人的人送一份,主要是給,但因為其他人也需要了解情況,所以抄送給抄送的人。為什么很多女生網名叫cc?我覺得女生網名cc的意思是純潔的意思。每個女孩都希望自己永遠保持年輕純潔,不被世俗化,能保持生命之初擁有的優秀品質。女生的網名cc就有上面的意思,所以很多女生都愿意給自己的網名取名cc。為什么很多女生網名叫cc?可能性如是...
騰訊圖書網加入書簽后怎么看書簽加在哪?打開騰訊圖書網的收藏列表,您可以直觀地看到您最近收藏的章節名稱。每次你點擊哪個章節的“書簽”,它都會顯示你的章節名稱,但它只會記錄你上一次收集的章節名稱,其他時間不會。先安裝QQ工具欄!然后登錄QQ,就可以看到書簽了!單擊以查找上一個書簽添加書簽里刪除的怎么恢復?1. 登錄QQ賬號,同步書簽檢索原來,QQ瀏覽器保存了很多書簽,但清理完瀏覽器緩存后,就不見了。不...
我的iphone上的報刊雜志圖標沒有了!怎么辦?iPhone上的報紙和雜志圖標不見了。有兩種方法可以恢復它。首先,恢復系統。Set-General-restore可恢復系統設置。其次,從系統中檢索圖標。只需在瀏覽器中鍵入以下路徑。然后將圖標拖到桌面上。系統/庫/核心服務/跳板.app報紙期刊現在還有發展前景嗎?報刊還有發展前景嗎?我認為這個問題的答案很簡單。我快60歲了。我以前每天早上都出去,不管...