手写一个JSON可视化工具

前言

JSON 平时大家都会用到,都不陌生,今天就一起来实现一个 JSON 的可视化工具。

大概长成下面的样子:

image.png

树展示

相比于现有的一些 JSON 格式化工具,我们今天制作的这个小工具会把 JSON 转为树去表示。其中:

  • 橙色标签表示 key
  • 蓝色标签表示 value
  • 绿色标签表示类型: Number String Object Array Null

左边是一个输入框,右边是一个实时反馈的 JSON 可视化区域。下面来看一下大致的实现思路:

  1. 当输入框的值变化时,使用 JSON.parse 解析值,如果是一个合法的 JSON ,则进行下一步处理;如果不是,则把异常显示出来
  2. 递归把 JSON 对象解析成数组树的结构,主要会包含以下几个 key
    • key 唯一标识,后续用做复制路径
    • title JSON 属性节点 key
    • value JSON 属性节点值
    • isArrayProps 是否是数组的节点
    • children 子节点
    • type 值类型
  const handleParse = useCallback(
    debounce((value) => {
      if (!value) {
        return;
      }
      try {
        const res = JSON.parse(value);
        setJson(res);
        setError(null);
        setUpdateKey((key) => key + 1);
        setSearchValue("");
      } catch (error) {
        setJson({});
        setError(error);
      }
    }, 300),
    []
  );

  useEffect(() => {
    handleParse(value);
  }, [value]);

value 是输入框的输入值,当输入值变化时,解析 JSON 。获取到新的 JSON 值后,开始递归处理,组装成树结构:

  const treeData = useMemo(() => {
    const dfs = (json, parentKey) => {
      const res = [];
      const keys = Object.keys(json);
      for (const index in keys) {
        const key = keys[index];
        const value = json[key];
        res[index] = {
          key: parentKey ? `['${parentKey}']['${key}']` : `['${key}']`,
          title: key,
          value: value ? value.toString() : value,
          isArrayProps: Array.isArray(json),
          children:
            typeof value === "object" && value !== null ? dfs(value, key) : [],
          type: upperFirst(
            value === null
              ? "null"
              : Array.isArray(value)
              ? "array"
              : typeof value
          ),
        };
      }
      return res;
    };
    try {
      return dfs(json, "");
    } catch (error) {
      console.log("err", error);
      return [];
    }
  }, [json]);

然后用一个树组件把它渲染出来:

<Tree
    showIcon
    showLine
    titleRender={renderTitle}
    key={updateKey}
    treeData={treeData}
    defaultExpandAll
/>

其中,我们希望自定义渲染树的每一个节点,所以可以实现一个 titleRender 方法:

  const renderTitle = (node) => {
    return (
      <div onClick={() => copy}>
        {!node.isArrayProps ? <Tag color="orange">{node.title}</Tag> : ""}
        {node.children.length === 0 && node.value ? (
          <Tag color="blue">{node.value}</Tag>
        ) : (
          ""
        )}
        <Tag color="green">{node.type}</Tag>
      </div>
    );
  };
  

image.png

这样就完成了基础的功能逻辑及渲染

搜索

这里我们拓展一个根据关键词搜索的功能,既可以搜索 key ,也可以搜索 value

用到一个 Search 组件来搜集 keyword

<Input.Search
  style={{ marginBottom: 8 }}
  placeholder="Search"
  onChange={(e) => setSearchValue(e.target.value)}
/>

然后当 keyword 变化的时候,去匹配树节点中的属性值,如果匹配到了,就把对应的值标红。

  const renderTitle = (node) => {
    const highlight = (strTitle) => {
      const index = strTitle.indexOf(searchValue);
      const beforeStr = strTitle.substring(0, index);
      const afterStr = strTitle.slice(index + searchValue.length);
      const title =
        index > -1 ? (
          <span>
            {beforeStr}
            <span style={{ color: "red" }}>{searchValue}</span>
            {afterStr}
          </span>
        ) : (
          <span>{strTitle}</span>
        );
      return title;
    };

    return (
      <div onClick={() => copy}>
        {!node.isArrayProps ? (
          <Tag color="orange">{highlight(node.title)}</Tag>
        ) : (
          ""
        )}
        {node.children.length === 0 && node.value ? (
          <Tag color="blue">{highlight(node.value)}</Tag>
        ) : (
          ""
        )}
        <Tag color="green">{node.type}</Tag>
      </div>
    );
  };

最后实现出来的效果就是这样的;

image.png

复制路径

我不知道大伙有过这样类似的需求:改动一个 json 对象某个 key 对应的值。我之前是有过这样的场景,那是在使用 Lottie 做动画的时候。

我需要对描述 Lottie 动画的 json 文件进行一些修改,但往往这种文件层级非常深,如果不借助一些工具,是很难找到对应的值的路径是什么,找不到路径就很难修改了。

那么我们有了这个工具之后,就很轻松可以通过搜索+复制的方式来找到某个值对应的路径。

<Clipboard text={node.key} onCopy={() => message.success("路径已复制")}>
    <div>
      {!node.isArrayProps ? (
        <Tag color="orange">{highlight(node.title)}</Tag>
      ) : (
        ""
      )}
      {node.children.length === 0 && node.value ? (
        <Tag color="blue">{highlight(node.value)}</Tag>
      ) : (
        ""
      )}
      <Tag color="green">{node.type}</Tag>
    </div>
</Clipboard>

用一个复制组件包裹树节点,点击的时候把节点的 key 属性复制到粘贴板。

image.png

image.png

这样就可以轻松获取到节点所对应的 key 了。

最后

以上就是本文的全部内容,如果你感兴趣的话,点点关注点点赞吧~

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

react native中基于webview的腾讯图形验证码

react native中基于webview的腾讯图形验证码 效果实例图第三方库 腾讯验证码 效果实例图 第三方库 npm i react-native-webviewreact-native-webview import React, { useEffect, useState } from react; import { StyleSheet, Text, View } from react-native; import { We…

QDial、QScrollBar、QSlider、QProcessBar的使用

实验目的 学习使用表盘dial、滑动条Slider、水平卷动条HorizentalScrollBar 学习使用ProcessBar &#xff0c;以及相关属性 textVisible 显示百分比或值、invertedAppearance 是否反转 学习使用信号、槽函数connect连接&#xff0c;将表盘表盘dial、滑动条Slider、水平卷动条H…

IT入门知识第二部分《编程语言》(2/10)

目录 IT入门知识博客文章大纲第二部分《编程语言》 1.引言 2.编程语言概述 2.1 编程语言的发展历程 2.2 编程范式 3.常见的编程语言 3.1 Python 3.2 Java 3.3 C 3.4 JavaScript 3.5 Ruby 4.编程语言的选择 4.1 技术需求 4.2 团队技能 4.3 社区和生态系统 4.4 可…

MBD(基于模型的定义)的相关标准与规范

【背景】 我国已进入工业化进程后期&#xff0c;制造业数字化转型不断加速&#xff0c;研发设计模式不断变革&#xff0c;MBD/MBE大势所趋。 MBD最早由波音公司提出&#xff0c;于2003年被美国ASME批准为机械产品工程的定义标准&#xff0c;标准号为ASMEY14.41。2006年ISO组织…

基于QT和C++实现的中国象棋

一&#xff0c;源码 board.h #ifndef BOARD_H #define BOARD_H#include <QWidget> #include "Stone.h"class Board : public QWidget {Q_OBJECT public:explicit Board(QWidget *parent 0);bool _bRedTurn; // 红方先走int _currentPlayer; // 当前玩家&…

破局消费供应链,企业费用管理如何应对变与不变?

供应链管理在过去一直被局限在生产与产品供应领域&#xff0c;更多被理解为生产及流通过程中&#xff0c;涉及将产品或服务提供给最终用户活动的上游与下游企业所形成的网链结构&#xff0c;即将产品从商家送到消费者手中整个链条。因为直接对企业利润产生重大影响&#xff0c;…

大模型精调:实现高效迁移学习的艺术

在人工智能领域&#xff0c;大型预训练模型&#xff08;以下简称“大模型”&#xff09;已经取得了令人瞩目的成果。这些模型通过在海量数据上进行预训练&#xff0c;能够捕捉到丰富的特征信息&#xff0c;为各种下游任务提供强大的支持。然而&#xff0c;如何将这些大模型应用…

2024 新项目还用java8的人到底是怎么想的,你又怎么看待这些人?

在开始前刚好我有一些资料&#xff0c;是我根据网友给的问题精心整理了一份「java的资料从专业入门到高级教程」&#xff0c; 点个关注在评论区回复“888”之后私信回复“888”&#xff0c;全部无偿共享给大家&#xff01;&#xff01;&#xff01; 对于2024年新项目仍选择使…

近万条英文智力问答题库ACCESS\EXCEL数据库

今天弄到了一份很不错的英文版智力问答题库&#xff0c;属于那种我很满意的数据库&#xff0c;原因有&#xff1a;1.记录数将近1万条达到库的基础&#xff1b;2.分类表信息包含大小分类非常详细&#xff1b;3.题目内容包含六七百条含有图片的题&#xff1b;4.题库除了选择题外还…

Web应用安全测试-综合利用(三)

Web应用安全测试-综合利用&#xff08;三&#xff09; XML注入 漏洞描述 可扩展标记语言 (Extensible Markup Language, XML) &#xff0c;用于标记电子文件使其具有结构性的标记语言&#xff0c;可以用来标记数据、定义数据类型&#xff0c;是一种允许用户对自己的标记语言进…

计算机专业毕设-校园二手交易平台

1 项目介绍 基于SpringBoot的校园二手交易平台&#xff1a;前端Freemarker&#xff0c;后端 SpringBoot、Jpa&#xff0c;系统用户分为两类&#xff0c;管理员、学生&#xff0c;具体功能如下&#xff1a; 管理员&#xff1a; 基本功能&#xff1a;登录、修改个人信息、修改…

2024年: 您准备好进行持续绩效管理了吗?

在过去几年中&#xff0c;”人力资源 “这个既最重要又最讨厌的过程受到了关注。每个人都在跃跃欲试&#xff0c;从静态的、以快照为基础的年度回顾转向频繁的双向对话。这是一个正确的时机&#xff1b;在当今复杂的业务和人际关系中&#xff0c;我们需要进行上下左右的沟通&am…

安装ps提示vcruntime140.dll丢失的多种有效的解决方法分享

在计算机使用过程中&#xff0c;我们经常会遇到一些错误提示&#xff0c;其中之一就是“找不到vcruntime140.dll”。这个错误通常出现在运行某些程序时&#xff0c;特别是ps这样的图像处理软件。那么&#xff0c;如何解决这个错误呢&#xff1f;小编将为您详细介绍打开提示ps找…

Django期末重点

思维导图 一、Djanog框架基础 MVT设计模式&#xff08;model模型【操作数据库】、template模板【页面展示】、view视图【处理请求和调用模型模板】&#xff09; 二、Django项目框架搭建 创建项目骨架 django-admin startproject 项目名启动服务 &#xff08;1&#xff09;p…

视频汇聚安防综合管理平台EasyCVR支持GA/T 1400视图库标准及设备接入配置

一、概述 视频汇聚安防综合管理平台EasyCVR视频监控系统已经与公安部GA/T 1400视图库标准协议实现了对接&#xff0c;即《公安视频图像信息应用系统》。 安防监控系统EasyCVR支持采用GA/T 1400进行对接&#xff0c;可实现人脸数据使用的标准化、合规化。其采用统一接口对接雪…

多模态融合算法分析

多模态融合算法分析 多模态论文多模态融合早期融合晚期融合混合融合模型级融合 对比分析早期融合&#xff08;Feature-level Fusion&#xff09;晚期融合&#xff08;Decision-level Fusion&#xff09;混合融合&#xff08;Hybrid Fusion&#xff09;ML-LSTM&#xff08;Multi…

【小白专用 已验证24.6.18】C# SqlSugar操作MySQL数据库实现增删改查

【小白专用24.6.18】C# SqlSugar&#xff1a;连接数据库实现简单的&#xff0c;增、删、改、查-CSDN博客 SqlSugar .Net ORM 5.X 官网 、文档、教程 - SqlSugar 5x - .NET果糖网 SqlSugar项目创建 通过NuGet包管理器搜索SqlSugar&#xff08;MySql还要安装MySql.Data、Newton…

C语言入门系列:数据类型之字符

文章目录 字符类型声明与初始化字符与单引号字符的内部表示字符类型的范围整数与字符的互换性字符变量的数学运算转义字符八进制与十六进制表示字符 字符类型声明与初始化 在C语言中&#xff0c;使用char关键字来声明字符类型变量。例如&#xff1a; char c B; // 声明并初始…

MongoDB和AI 赋能行业应用:零售

欢迎阅读“MongoDB 和 AI 赋能行业应用”系列的第三篇。 本系列重点介绍 AI 应用于不同行业的关键用例&#xff0c;涵盖制造业和汽车行业、金融服务、零售、电信和媒体、保险以及医疗保健行业。 利用生成式 AI 技术&#xff08;Gen AI&#xff09;&#xff0c;零售商可以创造…

【一】【网络使用小知识】使用aria2软件结合Windows PowerShell命令行快速下载文件

下载aria2软件 点击进入网址,aria2下载网址. 下载windows版本. 通过Windows PowerShell命令行使用aria2软件下载文件 通用下载文件命令行代码 aria2软件完整路径 -x 16 -s 32 -d 下载目录(文件夹) -o 文件名 下载链接路径示例,用aria2下载qq 找到aria2应用的直接地址,结合…