爲何博客園的markdown解析出問題了啊?好奇怪啊!javascript
一直以來在編碼規範界有2大爭論不休的話題,一個是關因而用空格縮進仍是tab縮進的問題,一個是花括號是否換行的問題,筆者是tab縮進
和花括號換行
的堅定擁護者,不解釋,省得挑起爭論。java
惋惜的是,幾乎找遍全網都找不到一個支持tab縮進
和花括號換行
的json格式化工具(IDE除外),包括Chrome在內,幾乎全部瀏覽器內置的代碼格式化都是空格縮進
和花括號不換行
的,每次看着花括號放在右上角像一個駝背的老婆婆的樣子,患有嚴重強迫症的我實在不爽,so,只能本身寫一個了。json
代碼很少,一共32行,掛在jQuery下面,若是不想要jQuery,單獨把formatJSON寫成一個方法就是了。數組
$.extend( { /** * 格式化一段JSON字符串,支持解析非標準JSON * 不一樣於絕大多數格式化工具,本方法支持設置縮進方式以及左大括號是否換行 * @start 2016-08-24 * @param {Object} json 要格式化的json串 * @param {Object} indent 縮進方式,能夠是若干個空格和tab,默認tab縮進,如 2個空格:" "、4個空格:" "、tab:" " * @param {Object} leftBracesInSameLine 左大括號是否保持在同一行,默認 false */ formatJSON: function (json, indent, leftBracesInSameLine) { function getIndentStr(level) { var str = ''; for(var i=0; i<level; i++) str += (indent || ' '); return str; } function format(obj, level) { level = level == undefined ? 0 : level; var result = ''; if(typeof obj == 'object' && obj != null) // 若是是object或者array { var isArray = obj instanceof Array, idx = 0; result += (isArray ? '[' : '{') + '\n'; for(var i in obj) { result += (idx++ > 0 ? ',\n' : ''); // 若是不是數組或對象的第一個內容,追加逗號 var nextIsObj = (typeof obj[i] == 'object' && obj[i] != null), indentStr = getIndentStr(level+1); result += (isArray && nextIsObj) ? '' : indentStr; // 若是當前是數組而且子項是對象,無需縮進 result += isArray ? '' : ('"' + i + '": ' + (nextIsObj && !leftBracesInSameLine ? '\n' : '') ); result += (!nextIsObj || (nextIsObj && leftBracesInSameLine && !isArray)) ? '' : indentStr; result += format(obj[i], level+1); // 遞歸調用 } result += '\n' + getIndentStr(level) + (isArray ? ']' : '}') + ''; } else // 若是是 null、number、boolean、string { var quot = typeof obj == 'string' ? '"' : '';//是不是字符串 result += (quot + obj + quot + ''); } return result; } return format(eval('(' + json + ')')); // 使用eval的好處是能夠解析非標準JSON } });
爲了方便演示,簡單寫了一個測試頁面,裏面沒啥東西,別見笑:瀏覽器
http://tool.liuxianan.commarkdown
(如下是之前寫的一個json高亮的效果圖,不是本文的效果圖,別誤會了,哈哈)工具
爲了方便演示,簡單寫了一個測試頁面,裏面沒啥東西,別見笑:測試
(如下是之前寫的一個json高亮的效果圖,不是本文的效果圖,別誤會了,哈哈)3d