zhijiancanxue

手写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(\'\');
}

分类:

技术点:

相关文章: