正则表达式优化JSON字符串的技巧


Posted in Javascript onDecember 24, 2015

json字符串很有用,有时候一些后台接口返回的信息是字符串格式的,可读性很差,这个时候要是有个可以格式化并高亮显示json串的方法那就好多了,下面看看一个正则表达式完成的json字符串的格式化与高亮显示

首先是对输入进行转换,如果是对象则转化为规范的json字符串,不是对象时,先将字符串转化为对象(防止不规范的字符串),然后再次转化为json串。其中json为输入。

if (typeof json !== 'string') {
json = JSON.stringify(json);
} else {
json = JSON.parse(json);
json = JSON.stringify(json);
}

等规范完数据之后对字符串进行标记,为了后面的切分、重新组合

这里有几个地方要添加标记,包括大括号、小括号的前后和逗号的后面都要添加标记,我这里使用的是换行\r\n(这样在命令行下测试时效果会比较好看)。

// 在大括号前后添加换行
reg = /([\{\}])/g;
json = json.replace(reg, '\r\n$1\r\n');
// 中括号前后添加换行
reg = /([\[\]])/g;
json = json.replace(reg, '\r\n$1\r\n');
// 逗号后面添加换行
reg = /(\,)/g;
json = json.replace(reg, '$1\r\n');

添加完成标记之后就要做一些优化处理,去掉多余的换行、去掉逗号前面的换行,这样做是为了在切分是免得出现空串浪费一次循环处理,最后在冒号后面添加空格,看起来更漂亮。

// 去除多余的换行
reg = /(\r\n\r\n)/g;
json = json.replace(reg, '\r\n');
// 逗号前面的换行去掉
reg = /\r\n\,/g;
json = json.replace(reg, ',');
//冒号前面缩进
reg = /\:/g;
json = json.replace(reg, ': ');

接下来就是对这个初步处理过的串进行进一步处理了,我会在function(index, node) {}函数中添加逻辑,对每一个切分单元进行处理,包括缩进和美化格式。

$.each(json.split('\r\n'), function(index, node) {});

首先说下缩进,缩进的方法很简单,遇到{、[符号时缩进增加1,遇到}、]符号时缩进减少1,否则缩进量不变。

//这里遇到{、[时缩进等级加1,遇到}、]时缩进等级减1,没遇到时缩进等级不变
if (node.match(/\{$/) || node.match(/\[$/)) {
indent = 1;
} else if (node.match(/\}/) || node.match(/\]/)) {
if (pad !== 0) {
pad -= 1;
}
} else {
indent = 0;
}

完成缩进后就该美化高亮显示代码了,这里要用到几个css规则,下面可以看到,对切分单元进行高亮显示的时候这里用正则进行判断,如果匹配到大括号标记为对象class、中括号标记为数组class、属性名称、属性值,一次对这些进行css规则添加,添加完成之后拼接起来就可以了。

.ObjectBrace{color:#00AA00;font-weight:bold;}
.ArrayBrace{color:#0033FF;font-weight:bold;}
.PropertyName{color:#CC0000;font-weight:bold;}
.String{color:#007777;}
.Number{color:#AA00AA;}
.Comma{color:#000000;font-weight:bold;} 
//添加代码高亮
node = node.replace(/([\{\}])/g,"<span class='ObjectBrace'>$1</span>");
node = node.replace(/([\[\]])/g,"<span class='ArrayBrace'>$1</span>");
node = node.replace(/(\".*\")(\:)(.*)(\,)?/g,"<span class='PropertyName'>$1</span>$2$3$4");
node = node.replace(/\"([^"]*)\"(\,)?$/g,"<span class='String'>\"$1\"</span><span class='Comma'>$2</span>");
node = node.replace(/(-?\d+)(\,)?$/g,"<span class='Number'>$1</span><span class='Comma'>$2</span>");

最后我们看看完整的方法代码(这里我使用了jquery类库),以及测试地址:

要对jsonstr进行美化,这样就可以了APP.format(jsonstr),直接输出至<pre></pre>标签中就可以看到效果,

下面是一个测试地址,http://iforever.sinaapp.com/ 可以进去试一下,看看完整的源代码

<script>
var APP=function(){
var format=function(json){
var reg=null,
result='';
pad=0,
PADDING=' ';
if (typeof json !== 'string') {
json = JSON.stringify(json);
} else {
json = JSON.parse(json);
json = JSON.stringify(json);
}
// 在大括号前后添加换行
reg = /([\{\}])/g;
json = json.replace(reg, '\r\n$1\r\n');
// 中括号前后添加换行
reg = /([\[\]])/g;
json = json.replace(reg, '\r\n$1\r\n');
// 逗号后面添加换行
reg = /(\,)/g;
json = json.replace(reg, '$1\r\n');
// 去除多余的换行
reg = /(\r\n\r\n)/g;
json = json.replace(reg, '\r\n');
// 逗号前面的换行去掉
reg = /\r\n\,/g;
json = json.replace(reg, ',');
//冒号前面缩进
reg = /\:/g;
json = json.replace(reg, ': ');
//对json按照换行进行切分然后处理每一个小块
$.each(json.split('\r\n'), function(index, node) {
var i = 0,
indent = 0,
padding = '';
//这里遇到{、[时缩进等级加1,遇到}、]时缩进等级减1,没遇到时缩进等级不变
if (node.match(/\{$/) || node.match(/\[$/)) {
indent = 1;
} else if (node.match(/\}/) || node.match(/\]/)) {
if (pad !== 0) {
pad -= 1;
}
} else {
indent = 0;
}
//padding保存实际的缩进
for (i = 0; i < pad; i++) {
padding += PADDING;
}
//添加代码高亮
node = node.replace(/([\{\}])/g,"<span class='ObjectBrace'>$1</span>");
node = node.replace(/([\[\]])/g,"<span class='ArrayBrace'>$1</span>");
node = node.replace(/(\".*\")(\:)(.*)(\,)?/g,"<span class='PropertyName'>$1</span>$2$3$4");
node = node.replace(/\"([^"]*)\"(\,)?$/g,"<span class='String'>\"$1\"</span><span class='Comma'>$2</span>");
node = node.replace(/(-?\d+)(\,)?$/g,"<span class='Number'>$1</span><span class='Comma'>$2</span>");
result += padding + node + '<br>';
pad += indent;
});
return result;
};
return {
"format":format,
};
}();
</script>

PS:正则表达式替换json字符串的某一项的数字值

aa=aa.replaceAll("\"ccfsID\":\"[0-9]*\"", "\"ccfsID\":\""+id1+"\"");

aa为json字符串,如:

{"items":[{"dishprice":30,"ccfsID":"","order.item.id":1,"zuofaid":"","zuofajiajia":0,"isTaoCan":false,"num":1,"price":30,"name":"","ID":"00000001","lsdishID":"","zuofaname":"","tzs":"","addTime":"2013-05-14"}],"deskId":"00000008"}
Javascript 相关文章推荐
JS与框架页的操作代码
Jan 17 Javascript
jQuery回车实现登录简单实现
Aug 20 Javascript
AngularJS基础知识笔记之过滤器
May 10 Javascript
使用javaScript动态加载Js文件和Css文件
Oct 24 Javascript
JS实现图片平面旋转的方法
Mar 01 Javascript
终于实现了!精彩的jquery弹幕效果
Jul 18 Javascript
vue.js项目打包上线的图文教程
Nov 16 Javascript
vue 系列——vue2-webpack2框架搭建踩坑之路
Dec 22 Javascript
Layui 设置select下拉框自动选中某项的方法
Aug 14 Javascript
探秘vue-rx 2.0(推荐)
Sep 21 Javascript
vue项目首屏打开速度慢的解决方法
Mar 31 Javascript
vue用elementui写form表单时,在label里添加空格操作
Aug 13 Javascript
jQuery实现移动端滑块拖动选择数字效果
Dec 24 #Javascript
不得不分享的JavaScript常用方法函数集(上)
Dec 23 #Javascript
JQuery实现的按钮倒计时效果
Dec 23 #Javascript
基于jquery实现鼠标左右拖动滑块滑动附源码下载
Dec 23 #Javascript
JS实现的倒计时效果实例(2则实例)
Dec 23 #Javascript
JavaScript对象数组排序函数及六个用法
Dec 23 #Javascript
JavaScript中的函数(二)
Dec 23 #Javascript
You might like
PHP服务器页面间跳转实现方法
2012/08/02 PHP
基于php设计模式中单例模式的应用分析
2013/05/15 PHP
解析php php_openssl.dll的作用
2013/07/01 PHP
Php无限级栏目分类读取的实现代码
2014/02/19 PHP
Ajax实现对静态页面的文章访问统计功能示例
2016/10/10 PHP
php递归函数怎么用才有效
2018/02/24 PHP
在多个页面使用同一个HTML片段的代码
2011/03/04 Javascript
浅谈javascript中的DOM方法
2015/07/16 Javascript
JavaScript实现cookie的写入、读取、删除功能
2015/11/05 Javascript
JavaScript中localStorage对象存储方式实例分析
2017/01/12 Javascript
原生JS实现几个常用DOM操作API实例
2017/01/19 Javascript
js转换对象为xml
2017/02/17 Javascript
JS仿淘宝搜索框用户输入事件的实现
2017/06/19 Javascript
javascript基础进阶_深入剖析执行环境及作用域链
2017/09/05 Javascript
AngularJS中table表格基本操作示例
2017/10/10 Javascript
禁止弹窗中蒙层底部页面跟随滚动的几种方法
2017/12/07 Javascript
详解Angular5 服务端渲染实战
2018/01/04 Javascript
Js中将Long转换成日期格式的实现方法
2018/06/05 Javascript
浅谈Vue初学之props的驼峰命名
2018/07/19 Javascript
JavaScript使用indexOf()实现数组去重的方法分析
2018/09/04 Javascript
微信小程序实现登录遮罩效果
2018/11/01 Javascript
Three.js实现简单3D房间布局
2018/12/30 Javascript
vuex根据不同的用户权限展示不同的路由列表功能
2019/09/20 Javascript
用Python中的wxPython实现最基本的浏览器功能
2015/04/14 Python
Python设置默认编码为utf8的方法
2016/07/01 Python
Python用5行代码写一个自定义简单二维码
2018/10/21 Python
python对象与json相互转换的方法
2019/05/07 Python
Html5元素及基本语法详解
2016/08/02 HTML / CSS
教师自我鉴定范文
2013/11/10 职场文书
2014年幼儿园个人工作总结
2014/11/10 职场文书
单位租车协议书
2015/01/29 职场文书
《月光曲》教学反思
2016/02/16 职场文书
浅析InnoDB索引结构
2021/04/05 MySQL
React实现动效弹窗组件
2021/06/21 Javascript
mongodb清除连接和日志的正确方法分享
2021/09/15 MongoDB
数据设计之权限的实现
2022/08/05 MySQL