随笔背景:在向后台请求数据之后,我们常常会拿到一串json格式.此时,为了方便查看key-value,程序猿们常常使用一些在线json格式化工具或者是类似于notepadd++这样的工具进行转换.今天笔者捋了捋思路,自己写了一个格式化json数据的小插件.记录于此.

1.在页面上部署一个空白的div,可以向里面输入json数据,方便转化.

html代码如下:

<div class="flexBox">
<div id="data2" contenteditable="true" style="height: 600px;flex: 8;overflow-y: scroll"></div>
<button style="flex: 1" id="jsonFormat2">JSON格式化</button>
</div>

  注意:设置div的contenteditable属性值为true,可以让一个div变的可编辑.(之前我一直以为只有input家族或者是textarea才能编辑....)

页面的截图如下:

2.接下来是通过js代码遍历json对象,实现格式化.

我的思路是:json对象无疑就是键值对(key-value),我们可以先遍历json对象的每个属性(key),判断属性值(value)的类型,如果是一个object,采用一个方法处理,如果是一个非object,则直接展示,我们姑且把上述方法定义为moreInfo,如果遍历到一个value的类型是Array(数组),那么我们再递归,继续循环调用moreInfo方法,直到把每一个最小单位的键值对取出来.

那么我们怎么让每一个键值对处于一个单行呢?这里我使用的是<p>标签,将key-value包裹在<p>标签即可.递归这一块儿,说起来挺绕的,需要把思路理清,考虑到每一种情况,再进行对应的操作.

说了我的思路,接下来是js代码部分:

var newEle='';
$('#jsonFormat2').on('click', function () {
var resData2=JSON.parse($('#data2').text());
$('#data2').html('');
newEle='';
for(var item in resData2){
if(typeof(resData2[item])!='object' || resData2[item]==null){
newEle+='<p><span class="title">'+item+'</span>:     '+resData2[item]+',</p>';
}else{
moreInfo(resData2[item],item);
}
}
$('#data2').html(newEle);
})

  上述代码中:newEle是我们最终要展示的格式化后的json数据结构,设置按钮的点击事件,一次进行判断处理.

接下来是比较关键的函数moreInfo了:

function moreInfo(obj,item){
if(obj instanceof Array){
newEle+='<p><span class="title">'+item+':['+'</span>'+'</p>';
for(var i=0;i<obj.length;i++){
if(typeof(obj[i])!='object'){
newEle+='<p><span class="title">'+obj[i]+',</span></p>';
}else{
moreInfo(obj[i],'')
}
}
newEle+='<p><span class="title">'+']'+'</span>'+',</p>';
}else if(typeof(obj)=='object' && !(obj instanceof Array)){
newEle+='<p><span class="title">'+item+'{'+'</span>'+'</p>';
for(var item in obj){
if(typeof(obj[item])!='object' || obj[item]==null){
newEle+='<p><span class="title">'+item+'</span>:     '+obj[item]+',</p>';
}else{
moreInfo(obj[item],item)
}
}
newEle+='<p><span class="title">'+'},'+'</span>'+'</p>';
}else{
newEle+='<p><span class="title">'+obj+'</span>'+',</p>';
}
}

  tips:虽然javascript的原生对象中,没有Array这种,也就是通过typeof()无法的到一个Array,即使是typeof(["1","2"]),返回的也是object.但是通过obj instanceof Array可以判断对象是否为数组类型.

3.最终的效果如下图:

内容太多就不一一截图了.

总结:最开始我在公司写了大概40分钟左右,但是在进入到moreInfo这个函数之后,始终无法将第二层的json对象中的键值对取出来,回家理清思路之后,解决了.原因有二:

1.第二层的对象有几个是数组,对于数组这块之前没有做处理,数组的元素可能是对象,也可能只是一个string,而对象的内部有可能还有对象以及string.....,如此递归循环

2.在调用moreInfo函数时,我最开始是将newEle作为一个参数传递进去的,通过return的方法,再返回出去.但实际上失败了,回家理清思路之后,就好了:

function moreInfo(obj,item,ele){
if(obj instanceof Array){
ele+='<p><span class="title">'+item+':['+'</span>'+'</p>';
for(var i=0;i<obj.length;i++){
if(typeof(obj[i])!='object'){
ele+='<p><span class="title">'+obj[i]+',</span></p>';
}else{
moreInfo(obj[i],'')
}
}
ele+='<p><span class="title">'+']'+'</span>'+',</p>';
}else if(typeof(obj)=='object' && !(obj instanceof Array)){
ele+='<p><span class="title">'+item+'{'+'</span>'+'</p>';
for(var item in obj){
if(typeof(obj[item])!='object' || obj[item]==null){
ele+='<p><span class="title">'+item+'</span>:     '+obj[item]+',</p>';
}else{
moreInfo(obj[item],item)
}
}
ele+='<p><span class="title">'+'},'+'</span>'+'</p>';
}else{
ele+='<p><span class="title">'+obj+'</span>'+',</p>';
}
}

  应该是在moreInfo函数内部再次调用moreInfo时,ele没有传递出去,导致newEle没有发生变化.

当然这个小插件还是有瑕疵的,比如说在对于对象结尾的那个逗号进行判断时,还需要优化.

ps:今天我觉得讲解的够详细了额,博客园审核的小编们,你们再将我的博客移出博客园首页的话,就说不过去了吧~ 0 0

自己做了一个json格式化工具,亲测可以使用的更多相关文章

  1. 有强迫症的我只能自己写一个json格式化工具

    缘由 为什么博客园的markdown解析出问题了啊?好奇怪啊! 一直以来在编码规范界有2大争论不休的话题,一个是关于是用空格缩进还是tab缩进的问题,一个是花括号是否换行的问题,笔者是tab缩进和花括 ...

  2. 用 Splashtop Wired XDisplay HD 让 ipad做电脑扩展屏幕__亲测有效

    参考: [1]https://blog.csdn.net/Tang_Chuanlin/article/details/86433152

  3. 无限重置IDE过期时间插件 亲测可以使用

    相信破解过IDEA的小伙伴,都知道jetbrains-agent这个工具,没错,就是那个直接拖入到开发工具界面,一键搞定,so easy的破解工具!这个工具目前已经停止更新了,尽管还有很多小伙伴在使用 ...

  4. 亲测可以使用的Axmath和MathPix插入word公式

    Axmath破解版链接 链接:https://pan.baidu.com/s/1Phak8mc3msKAMQ6H_5EN5g 提取码:glti MathPixTool和Axmath共同使用向word插 ...

  5. 手写一个json格式化 api

    最近写的一个东西需要对json字符串进行格式化然后显示在网页上面. 我就想去网上找找有没有这样的api可以直接调用.百度 json api ,搜索结果都是那种只能在网页上进行校验的工具,没有api. ...

  6. nginx代理https站点(亲测)

    nginx代理https站点(亲测) 首先,我相信大家已经搞定了nginx正常代理http站点的方法,下面重点介绍代理https站点的配置方法,以及注意事项,因为目前大部分站点有转换https的需要所 ...

  7. ASP.NET中的文件操作(文件信息,新建,移动,复制,重命名,上传,遍历)(亲测详细)

    做了几天的文件操作,现在来总结一下,错误之处,还望指点!以文件为例,如果对文件夹操作,基本上将File换为Directory即可(例:FileInfo file = new FileInfo(Path ...

  8. 推荐几个最好用的CRM软件,本人亲测

    CRM是英文Customer Relationship Management 的简写,一般译作“客户关系管理”.CRM最早产生于美国,由Gartner Group 首先提出的CRM这个概念的.20世纪 ...

  9. 电脑IP改变后oracle em无法登陆的解决办法(亲测)

    以下方法为本人亲测 情况:假设电脑初次安装oracle时的ip是192.168.133.110 那么进入em的地址就是http://192.168.133.110:1158/em/console/lo ...

随机推荐

  1. MSSQL附加数据库5120错误(拒绝访问)处理方法

    一. 右键需要附加的数据库文件,弹出属性对话框,选择安全标签页. 找到Authenticated Users用户名. 如未找到,进行Authenticated Users用户名的添加. 二. 添加Au ...

  2. C# Using 用法

    using 语句允许程序员指定使用资源的对象应当何时释放资源.为 using 语句提供的对象必须实现 IDisposable 接口.此接口提供了 Dispose 方法,该方法将释放此对象的资源. 一起 ...

  3. 【转】三十分钟掌握STL

    转自http://net.pku.edu.cn/~yhf/UsingSTL.htm 三十分钟掌握STL 这是本小人书.原名是<using stl>,不知道是谁写的.不过我倒觉得很有趣,所以 ...

  4. spring+hibernate实体类注解详解(非原创) + cascade属性取值

    @Entity //继承策略.另一个类继承本类,那么本类里的属性应用到另一个类中 @Inheritance(strategy = InheritanceType.JOINED ) @Table(nam ...

  5. Java汉字转拼音

    import net.sourceforge.pinyin4j.PinyinHelper; import net.sourceforge.pinyin4j.format.HanyuPinyinCase ...

  6. get_object_vars($var) vs array($var)

    get_object_vars(\(var) vs array(\)var) test case class Test { public function actionGetObjectVarsVsA ...

  7. ASP.NET MVC+Entity Framework 访问数据库

    Entity Framework 4.1支持代码优先(code first)编程模式:即可以先创建模型类,然后通过配置在EF4.1下动态生成数据库. 下面演示两种情形: 1.代码优先模式下,asp.n ...

  8. 在网页程序或Java程序中调用接口实现短信猫收发短信的解决方案

    方案特点: 在网页程序或Java程序中调用接口实现短信猫收发短信的解决方案,简化软件开发流程,减少各应用系统相同模块的重复开发工作,提高系统稳定性和可靠性. 基于HTTP协议的开发接口 使用特点在网页 ...

  9. VS 快捷键(待完善)

    本人使用的是VS2010版本的 感觉还算稳定. 快捷键: 1. Ctrl+E,U 用于对选中的代码行快速对齐: 2. Ctrl+R,E 用于对象属性的重构,比如对get,set属性的快速设置. 方法: ...

  10. js阻止提交表单(post)

    在注册页面,我们经常要用到页面验证,验证到不符合要求的数据就阻止提交到服务器,如下 <script type="text/javascript"> function C ...