JSON 格式化成视图模式
来源:互联网 发布:手机淘宝如何改店名 编辑:程序博客网 时间:2024/04/29 21:15
说到这个json格式化工具,相信大家都用过,比如我个人就喜欢用的一款本地化json格式化工具 HiJson,也有一些在线格式化工具 bejson, 这些工具都是将json转化为视图方便进行查看。今日我闲来无事,自己写了个简陋的json格式化视图工具,其实是为了方便公司的测试妹子来查看数据,因为她没此拉数据然后将数据解密出来,然后再格式化,我感觉挺浪费时间的,所有就给他做了一个工具,附带加解密功能,并将解密的结果转成json视图查看,下面是整体的效果图:
如上,左边是加解密工具,右边则是将解密的json字符串转成的视图(有点简陋^_^)!
今天这篇文章的重点是如何去实现右边json视图的功能,下面我把代码贴出来
文件名:kjson.js
/** * Created by 004928 on 2016/12/22. * json格式化工具 */function KJSON () { // 默认偏移量 var defaule_offsetX = 25; /** * 判断是否是JsonObject对象 * @param obj * @returns {*|boolean} */ function isJsonObject (obj) { return obj && typeof obj === "object" ; } /** * 判断是否是空的JSON对象 * @param obj */ function isEmptyJsonObject (obj) { return JSON.stringify(obj) == "{}" ; } /** * 判断是否是空的JSON数组 */ function isEmptyJsonArray (obj) { return JSON.stringify(obj) == "[]" ; } /** * 判断是否是JsonArray对象 * @param obj * @returns {boolean} */ function isJsonArray (obj) { return obj.length === "number" ; } /** * 取出JSON对象值为string 和 null 类型的值 * @param text * @returns {*} */ function getValue (key , obj) { if(obj[key] && typeof obj[key] === "object") { key = "╋"+key; } else if(!obj[key]) { key = key+":"+"null"; } else { key = key+":"+obj[key]; } return key; } /** * 创建元素 * @param parent * @param obj */ function createElement (parent , obj , propertyName , left) { var el = document.createElement("div"); var textNode = document.createTextNode(getValue(propertyName , obj)); el.appendChild(textNode); el.style.paddingLeft = left+"px"; parent.appendChild(el); addClickListener(el , obj[propertyName] , propertyName); } /** * 添加点击事件 * @param el * @param value */ function addClickListener (el , value , key) { if(isJsonObject(value)) { el.addEventListener("click" , function (event) { if(event.target == this) { // 判断当前项是否是展开状态 if(el.children.length > 0) { el.innerHTML = ""; el.innerText = "╋"+key; } else { el.innerText = el.innerText.charAt(0) == "╋" ? "━"+key: "╋"+key; if(typeof value.length === "number") { if(isEmptyJsonArray(value)) { el.innerText = el.innerText.concat(":[]"); return ; } var arrayTemp = {}; for(var i = 0 ; i < value.length ; i ++) { arrayTemp["["+i+"]"] = value[i]; createElement(el , arrayTemp , "["+i+"]" , defaule_offsetX); } } else { if(isEmptyJsonObject(value)) { el.innerText = el.innerText.concat(":{}"); return ; } for( propertyName in value) { createElement(el , value , propertyName , defaule_offsetX); } } } } }); } } /** * 转化为json * @param parent * @param jsonStr */ function toJson (parent , jsonStr) { if(jsonStr) { try{ var jsonObj = JSON.parse(jsonStr); for( propertyName in jsonObj) { createElement(parent , jsonObj , propertyName , 0); } }catch(e){ console.log("内容非json格式"); } } } return { /** * 暴漏给外部调用的方法 * @param parent * @param jsonStr */ toJson:function (parent , jsonStr) { toJson(parent , jsonStr); } };}
以上是所有js代码,通过调用toJson方法,传递两个参数
parent: 父容器div对象那个
jsonStr: json格式的字符串
首先说一下我实现的思路,我不是将所有json都解析后然后一个一个层级去创建,点击之后再展开显示,我是每次只遍历最外层,然后创建div添加进父div中,然后点击某个div再去创建其子元素,显示出来。如下结构:
{ "data":"123", "result":{ "name":"xxx" },}
如上,我会先创建data 和result的div,添加到其父div中,当点击result div时,我再去创建name div添加进去,因此我是每次点击父div的时候再去加载其子元素。所有主要方法看 addClickListener 方法,首先判断当前div是否有子元素,如果有,说明当前是展开状态,清除其所有子元素(因为我是点击之后再去加载其子元素的,所以如果 el.children.length > 0 说明当前是展开的),如果没有则判断当前div的值是jsonArray还是jsonObject,然后再分别对其遍历,创建元素。主要的逻辑代码都在addClickListener 方法中,大家可以仔细看,其中我做了一些优化判断,值是string,boolean,number的就没有设置监听,同事空的jsonArray和jsonObject的我会显示 “[]”和“{}”来表示当前对象/数组 没有值 。
最后贴一下在网页中如何去引用的代码:
<div id="parent"> // json视图父容器</div><script src="../js/kjson.js"></script><script> function changeToJsonView (){ var el = document.getElementById("parent"); var kjson = new KJSON(); kjson.toJson(el , "json格式的字符串"); }</script>
结束,写的不好大家见谅啊,欢迎批评指正,谢谢了!
- JSON 格式化成视图模式
- 对象序列化成JSON格式
- 一段序列化成JSON格式的代码
- jquery form表单序列化成json格式
- 将store中的记录格式化成json格式
- asp.net DataTable和Dataset序列化成Json格式
- 巧用正则替换-把纯文本格式化成json
- fastjson将对象格式化成json时的两个问题
- domino 视图显示json格式
- 将数组格式化成json格式(2 相关日期下的 费用)
- 将序列化成json格式后日期(毫秒数)转成日期格式
- C#格式化成小数
- 序列化成json数据
- Json序列化成实体
- 数字格式化成货币格式 1000 格式化成1,000
- js格式化成金额输出
- 格式化成财务类型数字
- 数字格式化成两位
- JS知道两点经纬度求距离
- UE4连接Oculus DK2的那些坑
- Mybatis的基本工作原理,与jdbc问题。
- Java 对象锁
- CVPR 2013文章点评
- JSON 格式化成视图模式
- CSS修改滚动条
- Windows学习总结(12)——Windows 10系统开始运行-cmd命令大全
- MVC+EF(8)
- MySQL命令总结
- 深度学习大数据
- linux下grep的时候报Binary file stdout.log matches解决方法
- LeetCode笔记:165. Compare Version Numbers
- Android Studio 出现 Gradle's dependency cache may be corrupt 错误分析