手把手教你写一个JSON在线解析的前端网站1

news2024/11/16 22:35:09

前言

作为一名Android开发,经常要跟后端同事联调接口,那么总避免不了要格式化接口返回值,将其转换为清晰直观高亮的UI样式以及折叠部分内容,方便我们查看定位关键的信息。

一直以来都是打开Google 搜索json格式化关键字,然后选择Google推荐的前三名的网址,比如

在这里插入图片描述

bejson网站:
https://www.bejson.com/

json.cn网站:
https://www.json.cn/

开源中国的JSON解析:
https://tool.oschina.net/codeformat/json

我自己搞的小网站在Google搜索上还排不上号,这里王婆卖瓜,自卖自夸一下,也分享一下子。

json2.top网站:
https://www.json2.top/

之前用的多,基本是直接json.cn来解决问题。现在用自己搭建的json2.top,感觉更爽一些😂。

技术实现

json2.top这个站点完全是一个前端项目,不涉及一点后端相关的技术。纯jQuery来实现的。实现部分参考了一下json.cn,应该说参考的部分比较多,搬运了不少他们的代码,但是最核心的逻辑还是自己完善思考出来的。

先来看看效果

在这里插入图片描述

在左侧输入JSON数据,右侧自动会对左侧的数据进行格式化转换, 变得规整清晰,代码高亮,还能够折叠。特别方便开发者专注于自己的核心数据。

接下来我们来具体讲讲如何实现这个功能,先从代码格式化来开始吧,折叠的部分可以放在后面。

先提前把需要的jQuery.js文件等引入好.

<script src="https://cdn.staticfile.org/jquery/2.1.1/jquery.min.js"></script>

然后准备两个div,用于放左侧的输入区域的内容,以及右侧格式化好的内容,具体代码如下

<div class="container">
    <div class="split">
        <div id="split-0">

<textarea id="json-src" placeholder="Please enter the JSON data... " class="form-control common-font-size"
          style="height:100%;padding:10px 10px 10px 30px;border:0;border-radius:0;resize: none;
                  outline:none;border: 1px solid #eee"></textarea>

        </div>

        <div id="split-1">
            <div id="right-box" class="common-font-size bg-color-ff"
                 style="width:100%;border:solid 1px #eee;border-radius:0;resize: none;overflow-y:scroll; outline:none;position:relative;flex: 1;flex-grow: 1;">
                <p class="editor-tip">Click on key and value to edit</p>
                <div id="hidden-message-box" class="alert alert-danger alert-dismissible"
                     role="alert"
                     style="display:none;margin-bottom:0;padding:10px 2vw;font-size: calc(var(--target) + 4px);">
                    <button type="button" class="close" data-dismiss="alert" aria-label="Close">
                        <span aria-hidden="true">×</span>
                    </button>
                    <p><i class="fa fa-bell" aria-hidden="true"></i>
                        tips:
                        <span id="hidden-message">
                      Default warning
                  </span>

                    </p>
                </div>
                <div id="line-num"
                     style="background-color:#fafafa;padding:0px 8px;float:left;border-right:dashed 1px #E5EBEE;display:none;color:#999;position:absolute;text-align:center;over-flow:hidden;">
                </div>
                <div class="ro" id="json-target"
                     style="padding:0px 32px;white-space: pre-line;word-wrap:break-word;"></div>
            </div>
        </div>
    </div>

</div>

下面是核心逻辑。
当我们在浏览器上粘贴了没有被格式化过的JSON数据后,我们的思路是先对这个JSON数据先解析,这里先不考虑容错问题,非JSON格式的数据等,只关注最关键的。

默认就用js提供的const obj = JSON.parse(content);来解析json字符串,如果这个json合法,那么我们会得到一个obj的对象,具体这个对象里面的内容都有啥,还需要进一步判断。

没有专门深究过js这门语言,不过总感觉js的类型比较多,又弱语言类型,判断obj具体是什么样的类型就比较无奈。

就以截图中左侧的内容为例来分析吧

{    "sites": [    { "name":"JSON Online Parse" , "url":"www.json2.top" },     { "name":"Google" , "url":"www.google.com" },     { "name":"Introducing JSON" , "url":"www.json.org" }    ]}

我们得到的obj是一个map结构,也可以说是是Java里面的对象object,可以理解为obj: {} 在js代码中判断object,用这样的判断typeof obj === "object"

接着在看, sites的结构是个数组,site:[] ,那么在js代码中如何判断数组,用这样的代码Array.isArray(site).

接着以"name":"JSON Online Parse"讲解,解析判断到这一步了,这个是site数组中的第一个对象,然后会对这个对象进行细分判断,取出对应的key"name", value"JSON Online Parse",因为在做格式化这一步,我们需要细分的比较细,那么会取出value,来判断value的类型,到了这一步,value已经算是原子类型了,没法在细分了(原谅我用Java语言的说法来描述), 那么如何判断"JSON Online Parse"是什么类型呢,我们明显能看出来,它是个string类型, 就用typeof obj === "string"来判断字符串吧.

由于这个例子没有数字,bool,以及null 那么目前的判断还是不够完善的.
判断数字的代码为typeof obj === "number"
判断bool的代码为typeof obj === "boolean"

字符串为“”以及null的都需要处理分别是obj === "" 以及 obj === null

上面涉及到的几大类型都介绍到了,那么就还是以上文的json数据,来编写代码吧,上文有讲到这个需要一层层的解析,那么可以想象的到,代码是个递归的逻辑,会出现循环调用的情况。

下面是完整的逻辑

function stringifyToHtml(obj, level) {
        if (obj === null) {
            return "<span class=\"json_null\" contenteditable=\"true\">null</span>";
        } else if (obj === "") {
            return "<span class=\"json_null\" contenteditable=\"true\">\"\"</span>";
        } else if (Array.isArray(obj)) {//说明是数组结构
            //console.log(obj);
            var str = "<span data-type=\"array\" data-size=\"" + obj.length + "\">" +
            "<i style=\"cursor:pointer;\" class=\"fa fa-minus-square-o\" οnclick=\"hide(this)\"></i>" + "[<br>";
            var blank = generateBlank(level);
            if (obj.length > 0) {
                for (let i = 0; i < obj.length; i++) {
                    const item = obj[i];
                    var json_value = stringifyToHtml(item, level + 1);
                    if (i == obj.length - 1) {
                        json_value += "<br>";
                    } else {
                        json_value += ",<br>";
                    }
                    str = str + blank + json_value;
                    //console.log(item);
                }
            }
            str += generateBlank(level - 1) + "]</span>";
            return str;
        } else if (typeof obj === "object") {//是一个object类型
            var str = "<span data-type=\"object\">" + "<i style=\"cursor:pointer;\" class=\"fa fa-minus-square-o\" οnclick=\"hide(this)\"></i>" + "{<br>";
            var blank = generateBlank(level);

            const keys = Object.keys(obj);
            for (let i = 0; i < keys.length; i++) {
              const key = keys[i];
              const value = obj[key];

              var json_key = "<span class=\"json_key\" contenteditable=\"true\">\"" + key + "\"</span>" + ": ";
              var json_value = stringifyToHtml(value, level + 1);
              if (i === keys.length - 1) {
                json_value += "";
              } else {
                json_value += ",<br>";
              }
              str = str + blank + json_key + json_value;
            }
             str += "<br>" + generateBlank(level - 1) + "}</span>";
             return str;
        } else if (typeof obj === "number") {
            return "<span class=\"json_number\" contenteditable=\"true\">" + obj + "</span>";
        } else if (typeof obj === "boolean") {
            return "<span class=\"json_boolean\" contenteditable=\"true\">" + obj + "</span>";
        } else if (typeof obj === "string") {
            return "<span class=\"json_string\" contenteditable=\"true\">\"" + obj + "\"</span>";
        } else {
            return "" + obj;
        }
      }

我们还是以前文的json数据来分析,下面会再贴一遍的

{    "sites": [    { "name":"JSON Online Parse" , "url":"www.json2.top" },     { "name":"Google" , "url":"www.google.com" },     { "name":"Introducing JSON" , "url":"www.json.org" }    ]}

在经过JSON.parse(content)处理后,我们得到了一个obj对象,接着需要判断当前obj具体是什么类型,是对象,还是数组,或者是原子类型(number,bool,string,null等类型)。所以在stringifyToHtml()这个函数体的内部,就是根据这些具体的类型来进一步处理的,每一个类型都有对应要展示出来的形式以及存在递归逻辑。在原子类型里面,基本就是展示处理了,只需要做好颜色样式展示,这个可以给定好css样式形式比如className,自己对具体的className编写对应的高亮效果啊就好了。在对象类型以及数组类型中,都还需要进行递归的逻辑。

比如说,刚拿到上面的那串字符串解析好的obj对象,判断它是对象类型后,就需要对齐进行拆分为两部分,key,value,格式化输出是要对key, value都做处理的,key就直接当做字符串展示出来就好,这里用的是var json_key = "<span class=\"json_key\" contenteditable=\"true\">\"" + key + "\"</span>" + ": ";这样的代码展示的,key也有自己的样式效果。然后就是value了,在对value处理的时候,也是要进行递归判断的,因为拿到的这个value,它的结构是个数组,如果不是用这个例子的话,它还可能是个对象,原子类型等等。另外由于对象类型存在多个key,value,所以在判断是对象类型后,还需要for循环这个对象类型呢,具体就参考else if (typeof obj === "object")这个分支判断的内部逻辑了,里面代码写的比较细致。仔细看,就能看懂。

接着说到,在拿到sites是个数组结构后,我们需要开始对sites这个数组结构进行格式化解析展示,处理对应的样式换行等等啊,换行这里不讲。同样先判断Array.isArray(obj)是数组,然后处理最外层的[]中括号符号,这个数组呢,也是需要for循环遍历的,遍历过程中,也存在递归情况。

这两块复杂的讲完了,剩下的都是原子类型啦,只需要取出对应的值,展示对应的样式效果就好了,代码特别简单。参考上文完整的代码吧。

最后

把上述代码整理后,放到了github上的仓库上,地址是https://github.com/xingstarx/jsonParseDemo

github上的项目支持用vercel部署的,这样就可以得到一个属于自己的在线解析工具啦。

直接访问这个https://www.json2.top/也可以,核心代码是一样的,只不过前端样式丰富了一些。

本文内容同步自个人博客站点xingstarx.top 欢迎围观,目前内容还不算多😂

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1084243.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【无标题】期权交易的实际操作流程是什么?

期权可以进行双向交易&#xff0c;即投资者认为期权后期会上涨&#xff0c;则可以通过交易软件进行做多买入认购操作&#xff0c;如果认为它后期会下跌&#xff0c;则可以通过交易软件件进行做空买入认沽操作&#xff0c;下文介绍期权交易的实际操作流程是什么&#xff1f; 期权…

2023年中国手机回收量、手机回收价值及行业细分现状分析[图]

手机回收的主要去向包括再销售及环保降解两类。其中进行再交易的二手手机多为9成新及以上手机。二手手机最终去向主要为再销售及环保降解。 2016年以来&#xff0c;我国手机总体出货量持续下滑&#xff0c;2022年全年&#xff0c;国内市场手机总体出货量累计2.72亿部&#xff0…

【代码随想录】算法训练营 第一天 第一章 数组 Part 1

数组基础知识补充 1. 在leecode中&#xff0c;数组一般是以vector容器的形式出现的&#xff0c;虽然vector的底层实现是array&#xff0c;但严格来讲vector是容器&#xff0c;不是数组&#xff1b; 2. 数组元素的删除和增添都需要移动后续元素&#xff0c;而且在实现的角度上…

C++初阶 入门

目录 1.用C的方式写一个Hello World 2.命名空间 2.1什么是命名空间&#xff1f; 2.2使用命名空间 3.C的输入输出 前言&#xff1a;C初阶系列&#xff0c;每一期博主都会使用简单朴素的语言将对应的知识分享给大家&#xff0c;争取让所有人都可以听懂&#xff0c;C初阶系列…

跨境电商迎来全球5日达革命?菜鸟全球化再提速!

近年来&#xff0c;随着全球化进程的加速和跨境电商的蓬勃发展&#xff0c;物流速度成为了电商行业的竞争制高点之一。消费者不再满足于等待数周&#xff0c;甚至数月的国际快递&#xff0c;他们期望能够像本地购物一样迅速收到国际包裹。 在这一背景下&#xff0c;跨境电商物…

众佰诚:开一家抖音小店需要交押金不?

随着电商行业的不断发展&#xff0c;越来越多的商家开始尝试在不同的平台上开设自己的店铺。抖音作为国内最热门的短视频平台之一&#xff0c;也吸引了众多商家的目光。那么&#xff0c;开一家抖音小店需要交押金吗?接下来&#xff0c;我们就来详细了解一下。 首先&#xff0c…

山西电力市场日前价格预测【2023-10-13】

日前价格预测 预测说明&#xff1a; 如上图所示&#xff0c;预测明日&#xff08;2023-10-13&#xff09;山西电力市场全天平均日前电价为228.86元/MWh。其中&#xff0c;最高日前价格为396.88元/MWh&#xff0c;预计出现在18: 30。最低日前电价为0.00元/MWh&#xff0c;预计出…

TCP/IP(十二)TCP的确认、超时、重传机制

一 TCP的确认应答机制 确认应答机制: 每次收到数据 都会 给对端发送一个应答报文(ACK) ① 带重传的肯定确认 确认机制: 超时 重传的 肯定 确认 --> 完成了两个作用,或者说有两个含义1、肯定[正确] 确认小结&#xff1a; 我的确认信息是针对正确数据做确认,而不是错误…

YOLOv5算法改进(2)— 注意力机制介绍(SE、CBAM和CA)

前言:Hello大家好,我是小哥谈。注意力机制是近年来深度学习领域内的研究热点,可以帮助模型更好地关注重要的特征,从而提高模型的性能。注意力机制可被应用于模型的不同层级,以便更好地捕捉图像中的细节和特征,这种模型在计算资源有限的情况下,可以实现更好的性能和效率。…

免费SSL证书

在当今数字化时代&#xff0c;保护用户数据和建立安全连接至关重要。对于网站管理员和拥有者来说&#xff0c;SSL证书&#xff08;Secure Sockets Layer&#xff09;是确保安全的关键工具之一。但是&#xff0c;传统上购买和维护SSL证书可能会带来昂贵的成本和繁琐的流程。幸运…

百度车牌识别AI Linux使用方法-armV7交叉编译

1、获取百度ai的sdk 百度智能云-登录 (baidu.com) 里面有两个版本的armV7和armV8架构。v7架构的性能比较低往往需要交叉编译&#xff0c;v8的板子性能往往比较好&#xff0c;可以直接在板子上编译。 解压到ubuntu里面。这里介绍v7架构的。 2、ubuntu环境配置 ubuntu下安装软件…

学生静态HTML网页作品下载后如何导入到HBuilderX中编辑修改及运行

很多同学编辑网页要求使用HBuilder X软件&#xff0c;下载学生网页设计作品后&#xff0c;不知道如何打开&#xff0c;很多同学反应把HTML中的代码复制到HBuilder X后不显示图片或者跑版。今天STU网页为大家讲解下静态HTML网页作品如何导入HBuilder X中运行。 HBuilder X 导入…

『PyQt5-Qt Designer篇』| 13 Qt Designer中如何给工具添加菜单和工具栏?

13 Qt Designer中如何给工具添加菜单和工具栏? 1 创建默认窗口2 添加菜单栏3 查看和调用1 创建默认窗口 当新创建一个窗口的时候,默认会显示有:菜单栏和状态栏,如下: 可以在菜单栏上右键-移除菜单栏: 可以在菜单栏上右键-移除状态栏: 2 添加菜单栏 在窗口上,右键-创建…

城市排水管网监测方案(新型排水管网智能监测技术)

随着我国城市化进程不断加快,城市的排水管网也日益增长并变得复杂,对其进行实时监测以确保正常运行变得极为重要。针对此需求,基于工业物联网技术的新型智能排水管网监测系统为城市排水管网的运行与维护提供了有效手段。 该智能排水管网监测系统以无线通讯功能强大的SG600工业…

VMware和Debian下载

文章目录 ⭐️写在前面的话⭐️一、VMware二、Debain三、建立虚拟机&#x1f680; 先看后赞&#xff0c;养成习惯&#xff01;&#x1f680;&#x1f680; 先看后赞&#xff0c;养成习惯&#xff01;&#x1f680; ⭐️写在前面的话⭐️ CSDN主页&#xff1a;程序员好冰 目前在…

uniapp + vue3 静态图片引入

方法一 从新定义路径 一定看好你图片的路径 代码 <template><div class"main">Main<img :src"getImg()" alt""></div> </template><!-- 方式一 // <script setup> // let imgName logo.png // cons…

共享WiFi二维码项目如何加盟代理?有哪些注意事项!

随着移动互联网的发展&#xff0c;如今WiFi热点已成为人们日常生活的必需品。而共享wifi二维码项目也渐渐成为了一个非常有前景的共享商业模式。用户可以通过扫共享wifi二维码享受免费的上网服务&#xff0c;而加盟商则可以赚取一定的推广费用&#xff0c;是一种非常理想的商业…

ppt怎么压缩到10m以内?分享ppt缩小方法

在日常工作中&#xff0c;我们常常需要制作和分享PowerPoint演示文稿&#xff0c;然而&#xff0c;有时候文稿中的图片、视频等元素会导致文件过大&#xff0c;无法在电子邮件或其他平台上顺利传输。为了将PPT文件压缩到10M以内&#xff0c;我们可以使用一些专门的文件压缩工具…

EasyRAFT

EasyRaft 介绍 EasyRaft是Raft&#xff08;共识算法&#xff09;的Java实现&#xff0c;主要目的在于提供一种高性能的分布式一致性协议。 覆盖Jraft实现的功能 分布式一致性 分布式一致性 (distributed consensus) 是分布式系统中最基本的问题&#xff0c;用来保证一个分布式…

使用kaliber与imu_utils进行IMU、相机+IMU联合标定

目录 1 标定工具编译 1.1 IMU标定工具 imu_utils 1.2 相机标定工具 kaliber 2 标定数据录制 3 开始标定 3.1 IMU标定 3.2 相机标定 3.3 相机IMU联合标定 4 将参数填入ORBSLAM的文件中 1 标定工具编译 1.1 IMU标定工具 imu_utils 标定IMU我们使用imu_utils软件进行标定…