最近项目需要用到将json格式化展示在html页面中,在这里简答整理一下其中逻辑实现,将json转换为对象Object然后判断数据类型进行处理。
分析json格式化样式
这里我们先分析一下json格式化后的展示方式,例子:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| { "type": "type1", "total": 111, "data": [{ "time": "2016-10-10 22:22:22", "flag": null, "appear": { "head": "head", "list": ["123","123","123"] } }, { "time": "2016-10-10 22:22:22", "flag": true, "appear": { "head": "head", "list": ["123","123","123","123","123"] } }] }
|
json样式/颜色
为了使得展示的体验增加,我们可以根据不同的数据类型设置不同的颜色展示。
- 基本符号,
{}
、[]
、:
、""
、,
- 字符串
- 数字
- true/false/null
js判断数据类型
下面我们通过js来判断数据类型。
- Object对象
typeof value === 'object'
- 在javascript中,null也会被判断为object,所以我们可以添加个条件
- 即
value && typeof value === 'object'
- 这里数组Array也会被判断为object,下面我们讲一下数组的判断
- Array数组
- 我们可以使用consturctor来判断数组
value.constructor === Array
Object.prototype.toString.call(value) === '[object Array]'
- 后一种是公认的靠谱解法,具体下来大家自己思考哈
- String字符串
typeof value === 'string'
- Number数字
typeof value === 'number'
- Null
- Boolen
typeof value === 'boolen'
实现逻辑
通过上述json分析,我们可以使用两种方式实现json格式化:
- 分析JSON.stringify()后的字符串,使用正则把需要的格式匹配替换
- 将json转化为object,然后通过js判断数据类型进行格式化
这里我们使用第二种方法实现。
第一种实现可以参考上一篇《将json输出为html(一):字符串正则匹配》。
字符串匹配
判断数据类型并进行处理
- 对象Object,将处理为
{<span class="key">"key"</span>:value}
,并进入检测递归
- 数组Array,将处理为
[value,value]
,并将进入检测递归
- true/false/null,将处理为
<span class="boolen/null">true/false/null</span>
- 字符串,将处理为
<span class="string">"string"</span>
- 数字Number,将处理为
<span class="number">1</span>
实现
这里将上述的逻辑进行实现。
数组不换行实现
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56
| function ObjectToHtml(data) { var txt = typeof data === 'string' ? data : JSON.stringify(data); try { var obj = eval('(' + txt + ')'); } catch (e) { alert('数据源语法错误,JSON格式化失败! 错误信息: ' + e.description, 'err'); return } var line = '</br>', indentChar = ' '; var getTab = function(num) { for (var i = 0, tab = ''; i < num; i++) { tab += indentChar; } return tab; }; var format = function(value, indent , isLast , inArray ) { var str = ''; if (Object.prototype.toString.call(value) === '[object Array]') { str += '['; value.forEach(function(item, index) { str += format(item, indent, index === (value.length - 1), true); }); str += ']'; } else if (value === null) { str += '<span class="null">null</span>'; } else if (typeof value === 'object') { str += '{' + line + getTab(++indent); var keys = Object.keys(value); keys.forEach(function(key, index) { str += '<span class="key">' + key + '</span>: ' + format(value[key], indent, index === (keys.length - 1)); }); str += '}'; indent--; } else if (typeof value === 'boolean') { str += '<span class="boolean">' + value + '</span>'; } else if (typeof value === 'string') { str += '<span class="string">' + value + '</span>'; } else { str += '<span class="number">' + value + '</span>'; } str += (isLast ? '' : ',') + (inArray ? '' : (line + getTab(isLast ? --indent : indent))); return str; } return ('<div class="json">' + format(obj, 0, true) + '</div>'); }
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64
| function ObjectToHtml(data) { var txt = typeof data === 'string' ? data : JSON.stringify(data); try { var obj = eval('(' + txt + ')'); } catch (e) { alert('数据源语法错误,JSON格式化失败! 错误信息: ' + e.description, 'err'); return } var line = '</br>', indentChar = ' '; var isObject = function(item) { return item && typeof item === 'object' && Object.prototype.toString.call(item) !== '[object Array]'; }; var getTab = function(num) { for (var i = 0, tab = ''; i < num; i++) { tab += indentChar; } return tab; }; var format = function(value, indent, isLast, inArray) { var str = ''; if (Object.prototype.toString.call(value) === '[object Array]') { str += '[' + (isObject(value[0]) ? '' : (line + getTab(++indent))); value.forEach(function(item, index) { str += format(item, indent, index === (value.length - 1), true); str += isObject(item) ? '' : (line + getTab((index === (value.length - 1)) ? --indent : indent)); }); str += ']'; } else if (value === null) { str += '<span class="null">null</span>'; } else if (typeof value === 'object') { str += '{' + line + getTab(++indent); var keys = Object.keys(value); keys.forEach(function(key, index) { str += '<span class="key">"' + key + '"</span>: ' + format(value[key], indent, index === (keys.length - 1)); }); str += '}'; indent--; } else if (typeof value === 'boolean') { str += '<span class="boolean">' + value + '</span>'; } else if (typeof value === 'string') { str += '<span class="string">"' + value + '"</span>'; } else { str += '<span class="number">' + value + '</span>'; } str += (isLast ? '' : ',') + (inArray ? '' : (line + getTab(isLast ? --indent : indent))); return str; } return ('<div class="json">' + format(obj, 0, true) + '</div>'); }
|
结束语
这里我们讨论了js判断数据类型并进行转换的实现方法。
此处查看项目代码
此处点击查看页面
查看Github有更多内容噢:https://github.com/godbasin
更欢迎来被删的前端游乐场边撸猫边学前端噢
如果你想要关注日常生活中的我,欢迎关注“牧羊的猪”公众号噢