自己做了一个json格式化工具,亲测可以使用

随笔背景:在向后台请求数据之后,我们常常会拿到一串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

时间: 2024-10-11 16:59:04

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

大数据开发环境需要的安装包合集,亲测没问题

大数据环境需要的安装包合集,包括: apache-flume-1.7.0-bin.tar.gz apache-hive-1.2.1-bin.tar.gz hadoop-2.7.2.tar.gz hbase-1.3.1-bin.tar.gz jdk-8u144-linux-x64.tar kafka_2.11-0.11.0.2.tgz mysql-5.7.20-1.el7.x86_64.rpm-bundle.tar scala-2.11.8.tgz spark-2.1.1-bin-hadoop2.

手写一个json格式化 api

最近写的一个东西需要对json字符串进行格式化然后显示在网页上面. 我就想去网上找找有没有这样的api可以直接调用.百度 json api ,搜索结果都是那种只能在网页上进行校验的工具,没有api. 那只有自己去实现一个json 格式化工具. 仔细分析,实现起来并不是很困难,至少思路很清晰. 需要解决的几个问题: 对json的校验:主要是符号的匹配: 格式化预处理:去除键值对之间的空白字符: 格式化:主要是缩进的问题,要符合json通常展示的格式. 解决的办法: 针对A问题: 可以采用栈去匹配符

得到影视源码分享(有演示),带一键采集,亲测能用,适合懒人做电影站!

源码说明:非常漂亮大气的一个电影板子,淘宝卖150元的,正版无错,带一键采集,也可以设定自动采集,做电影站的朋友喜欢就拿去吧!安装说明:1.直接打开域名自动运行安装2.登陆苹果cms后台-系统管理-当前使用模板-选择M19383.进入后台.---视频管理---视频分类---按下面的模板说明配置---分类模板--------------------------------------------------------------------分类ID.分类名称. 英文名     频道模板     

提供一个不错的物流物流接口给大家,本人亲测,真的不错

最近做了一个购物商城.在网上卖商品,客户反馈,购买的商品,订单管理看不到商品发货情况,现在的客户要求越来越高,比如:客户希望看到订单的物流轨迹,什么时候发货,货发到哪里了,什么时候安排派送,这些信息需要物流公司提供,有些客户还指定发某个快递公司,大部分物流快递是不会直接跟我们做物流接口的,即使对接,成本也很高,一家一家对接,周期长,维护成本也高,于是乎,我冒出一个想法,有没有这样的接口,就像支付接口一样,集成了所有的银行接口,只要对接了支付接口,比如微信支付,就不需要一家一家对接银行了, 我在百

做的一个android服务器获取数据json

//首先从服务器端得到的是一个Json数组          jsonArray = TestHTTP.JsonHttpGet(url);            for (int i = 0; i < jsonArray.length(); i++) {          //得到的json数组是"{username:12547}"这样的.还有把他解析成单个的值12547      JSONObject json = jsonArray.getJSONObject(i);    

亲测VS2010纯静态编译QT4.8.0,实现VS2010编译调试Qt程序,QtCreator静态发布程序(图文并茂,非常详细)

下载源代码,注意一定是源码压缩包如qt-everywhere-opensource-src-4.8.0.zip,不是Qt发布的已编译的不同版本的标准库如qt-win-opensource-4.8.0-vs2010.exe,这些版本都只是动态编译的,不是我们所需要的.只有用源码包才能做真正的纯静态编译,如果用Qt官网已编译的标准库.exe文件进行编译,有可能出现各种错误,而且编译后的文件巨大,我当时就在这里绕了很大的弯子,请童鞋们注意啦!!可能有些老鸟会笑话,但我本着最严肃的态度告诉菜鸟们,上网查

Linux 下 将使用Python-Django开发的web应用布置到服务器上(亲测有效)

写在前面: Django是一个卓越的新一代Web框架,相信使用Python的人对此并不陌生,但将我们完成的web应用布置到到服务器上并不是一件容易的事情. Django详细的教程可以参考http://python.usyiyi.cn/django/index.html. Django有自己的一个调试服务器,通过在项目文件夹下执行: python  manage.py runserver 8080(参数8080是设置的端口号,指明该服务器使用端口号为8080) 但是此语句也仅限在自己的机器上进行调

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

以下方法为本人亲测 情况:假设电脑初次安装oracle时的ip是192.168.133.110 那么进入em的地址就是http://192.168.133.110:1158/em/console/logon/logon 假设电脑的IP改变为192.168.88.66 那么进入em的地址应该是http://192.168.88.66:1158/em/console/logon/logon 但是测试后,输入上述地址无法进入em,原因是电脑ip改变了,oracle需要修改配置文件才可以访问,一般修改配

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

做了几天的文件操作,现在来总结一下,错误之处,还望指点!以文件为例,如果对文件夹操作,基本上将File换为Directory即可(例:FileInfo file = new FileInfo(Path);与DirectoryInfo directory = new DirectoryInfo (Path);) 1获取文件信息 在知道文件相对路径的情形,下面代码可以获取文件的详细信息 1 public static void fileinfo(string Path) 2 { 3 Path = S