手写js代码格式化json数据
手写js代码格式化json数据
使用JavaScript格式化json数据。需要引入jQuery库。代码简单易懂,主要思想是递归,因为每层的数据格式都是一样的。
function jsonFormat(txt, tiperror, compress/*是否为压缩模式*/) {/* 格式化JSON源码(对象转换为JSON文本) */
var indentChar = ' ';
if (/^\s*$/.test(txt)) {
if (tiperror)
alert('数据为空,无法格式化! ');
return;
}
// 替换\r\n 换行
txt=txt.replace(/\\r/g,"CRAPAPI_R");
txt=txt.replace(/\\n/g,"CRAPAPI_N");
txt=txt.replace(/\\t/g,"CRAPAPI_T");
var data;
try {
data=$.parseJSON(txt);
} catch (e) {
if (tiperror)
alert('数据源语法错误,格式化失败! 错误信息: ' + e.description, 'err');
return;
}
;
var draw = [], last = false, This = this, line = compress ? '' : '\n', nodeCount = 0, maxDepth = 0;
var notify = function(name, value, isLast, indent/*缩进*/, formObj) {
nodeCount++;/*节点计数*/
for (var i = 0, tab = ''; i < indent; i++)
tab += indentChar;/* 缩进HTML */
tab = compress ? '' : tab;/*压缩模式忽略缩进*/
maxDepth = ++indent;/*缩进递增并记录*/
if (value && value.constructor == Array) {/*处理数组*/
draw.push(tab + (formObj ? ('"' + name + '":') : '') + '[' + line);/*缩进'[' 然后换行*/
for (var i = 0; i < value.length; i++)
notify(i, value[i], i == value.length - 1, indent, false);
draw.push(tab + ']' + (isLast ? line : (',' + line)));/*缩进']'换行,若非尾元素则添加逗号*/
} else if (value && typeof value == 'object') {/*处理对象*/
draw.push(tab + (formObj ? ('"' + name + '":') : '') + '{' + line);/*缩进'{' 然后换行*/
var len = 0, i = 0;
for ( var key in value)
len++;
for ( var key in value)
notify(key, value[key], ++i == len, indent, true);
draw.push(tab + '}' + (isLast ? line : (',' + line)));/*缩进'}'换行,若非尾元素则添加逗号*/
} else {
if (typeof value == 'string') {
value = value.replace(/\"/gm, '\\"');
// 替换\r\n 换行
value=value.replace(/CRAPAPI_R/g,"\\r");
value=value.replace(/CRAPAPI_N/g,"\\n");
value=value.replace(/CRAPAPI_T/g,"\\t");
value = '"' + value + '"';
}
draw.push(tab + (formObj ? ('"' + name + '":') : '') + value
+ (isLast ? '' : ',') + line);
}
;
};
var isLast = true, indent = 0;
notify('', data, isLast, indent, false);
return draw.join('');
}