使用 Vue 实现 JSON 在线格式化

news/2025/2/15 21:49:57/文章来源:https://www.cnblogs.com/szz1/p/18717447

目录

  • 简介
  • 项目初始化
  • 实现 JSON 格式化功能
  • 添加代码高亮与美化
  • 完善用户交互
  • 完整示例代码
  • 小结
  • 参考资料

简介

JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,在前端和后端开发中被广泛使用。然而,手写或调试 JSON 时,可能会遇到格式混乱或难以阅读的问题。因此,开发一个JSON 在线格式化工具能提高开发效率。

本文将使用 Vue 3 + Vue Composition API 来实现一个简单的 JSON 在线格式化工具,支持:

  1. 输入 JSON 字符串,格式化并高亮显示。
  2. 处理 JSON 解析错误,给出错误提示。
  3. 复制格式化后的 JSON 方便使用。

项目初始化

首先,使用 Vite 创建一个 Vue 3 项目:

npm create vite@latest json-formatter --template vue
cd json-formatter
npm install
npm run dev

src/components/JsonFormatter.vue 创建组件,代码结构如下:

src/├── components/│   ├── JsonFormatter.vue├── App.vue├── main.js

实现 JSON 格式化功能

JsonFormatter.vue 中,使用 Vue 处理 JSON 格式化逻辑。

<template><div class="json-formatter"><h2>JSON 在线格式化工具</h2><textarea v-model="jsonInput" placeholder="请输入 JSON 数据"></textarea><button @click="formatJson">格式化</button><button @click="clearJson">清空</button><pre v-if="jsonOutput" class="json-output">{{ jsonOutput }}</pre><p v-if="error" class="error">{{ error }}</p></div>
</template><script setup>
import { ref } from 'vue';const jsonInput = ref('');
const jsonOutput = ref('');
const error = ref('');const formatJson = () => {try {jsonOutput.value = JSON.stringify(JSON.parse(jsonInput.value), null, 2);error.value = '';} catch (err) {error.value = 'JSON 格式错误,请检查输入!';}
};const clearJson = () => {jsonInput.value = '';jsonOutput.value = '';error.value = '';
};
</script><style scoped>
.json-formatter {max-width: 600px;margin: auto;text-align: center;
}
textarea {width: 100%;height: 150px;padding: 8px;font-size: 14px;
}
button {margin: 10px;padding: 8px 12px;cursor: pointer;
}
.json-output {background: #f4f4f4;padding: 10px;white-space: pre-wrap;text-align: left;
}
.error {color: red;
}
</style>

解析说明:

  • jsonInput 绑定用户输入内容。
  • formatJson 解析 JSON,并使用 JSON.stringify 格式化输出。
  • clearJson 清空所有内容。
  • 如果 JSON 解析失败,显示错误信息。

添加代码高亮与美化

使用 prismjs 为格式化后的 JSON 添加语法高亮。

安装 prismjs

npm install prismjs

引入 Prism.js 并应用样式

JsonFormatter.vue 组件中:

<script setup>
import { ref, watch } from 'vue';
import Prism from 'prismjs';
import 'prismjs/themes/prism-tomorrow.css';const jsonInput = ref('');
const jsonOutput = ref('');
const error = ref('');const formatJson = () => {try {jsonOutput.value = JSON.stringify(JSON.parse(jsonInput.value), null, 2);error.value = '';highlightJson();} catch (err) {error.value = 'JSON 格式错误,请检查输入!';}
};const highlightJson = () => {setTimeout(() => {Prism.highlightAll();}, 0);
};
</script><template><pre v-if="jsonOutput" class="json-output"><code class="language-json">{{ jsonOutput }}</code></pre>
</template>

完善用户交互

添加复制功能

<button @click="copyJson" v-if="jsonOutput">复制</button><script setup>
const copyJson = () => {navigator.clipboard.writeText(jsonOutput.value).then(() => {alert('复制成功!');});
};
</script>

完整示例代码

<template><div class="json-formatter"><h2>JSON 在线格式化工具</h2><textarea v-model="jsonInput" placeholder="请输入 JSON 数据"></textarea><button @click="formatJson">格式化</button><button @click="clearJson">清空</button><button @click="copyJson" v-if="jsonOutput">复制</button><p v-if="error" class="error">{{ error }}</p><pre v-if="jsonOutput" class="json-output"><code class="language-json">{{ jsonOutput }}</code></pre></div>
</template><script setup>
import { ref, watch } from 'vue';
import Prism from 'prismjs';
import 'prismjs/themes/prism-tomorrow.css';const jsonInput = ref('');
const jsonOutput = ref('');
const error = ref('');const formatJson = () => {try {jsonOutput.value = JSON.stringify(JSON.parse(jsonInput.value), null, 2);error.value = '';highlightJson();} catch (err) {error.value = 'JSON 格式错误,请检查输入!';}
};const highlightJson = () => {setTimeout(() => {Prism.highlightAll();}, 0);
};const clearJson = () => {jsonInput.value = '';jsonOutput.value = '';error.value = '';
};const copyJson = () => {navigator.clipboard.writeText(jsonOutput.value).then(() => {alert('复制成功!');});
};
</script><style scoped>
.json-formatter {max-width: 600px;margin: auto;text-align: center;
}
textarea {width: 100%;height: 150px;padding: 8px;font-size: 14px;
}
button {margin: 10px;padding: 8px 12px;cursor: pointer;
}
.json-output {background: #2d2d2d;color: #f8f8f2;padding: 10px;white-space: pre-wrap;text-align: left;overflow-x: auto;
}
.error {color: red;
}
</style>

小结

本文介绍了如何使用 Vue 3 实现一个 JSON 在线格式化工具,主要实现:

  1. 输入 JSON 并格式化,处理错误信息。
  2. 高亮显示 JSON,使用 Prism.js。
  3. 支持复制功能,便于快速使用。

这个小工具可用于 Web 应用中的 JSON 处理,或者作为 Chrome 扩展的基础。


参考资料

  • Vue 官方文档
  • Prism.js 代码高亮
  • Clipboard API 复制功能
  • JSON在线美化工具

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【每日一题】20250215

我只懂得一种活法,那就是找一件事坚持下去,以战胜生命的虚无。【每日一题】(多选)实验表明,可见光通过三棱镜时各色光的折射率 \(n\) 随着波长 \(\lambda\) 的变化符合科西经验公式,\(n=A+\frac{B}{\lambda^2}+\frac{C}{\lambda^4}\),其中 \(A\)、\(B\)、\(C\) 是正的常…

用IRFZ44N MOS管制作一个开关电路并测试其导通电压

用IRFZ44N NMOS管当开关管,设计一个开关电路,控制小灯泡的亮灭 下面是电路图,小灯泡大小为24V 10W图中R1是泄放电阻,因为GS间有结电容,如果没有加R1,在V2关断时,小灯泡不会立即熄灭,还会维持很长一段时间,明显不合理。 相比于三极管,MOS管能够承载的电流更大,更适用…

撑起计算机视觉半边天的ResNet【论文精读】

ResNet论文精读:深度残差学习如何重塑深度学习一、技术演进背景:深度网络的困境与突破 消失的梯度与退化问题 在ResNet提出之前,深度学习领域已通过VGGNet、GoogLeNet等模型验证了网络深度的重要性。然而,当网络深度超过20层时,研究者发现了一个反直觉现象:更深的网络反而…

2025多校冲刺省选模拟赛13

2025多校冲刺省选模拟赛13\(T1\) A. 逆序对 \(56pts\)原题: luogu P5972 [PA 2019] Desant部分分\(56pts\) :爆搜。点击查看代码 int a[50]; pair<int,ll>ans[50]; struct BIT {int c[50];int lowbit(int x){return x&(-x);}void add(int x,int val){for(int i=x;i…

使用 Git 命令和 Github 前须了解的知识

本文不包括 Git 命令的介绍与使用,只分享 Git 的关键概念与 Github 项目的基本工作流程。作者相信先了解它们对后续的学习和工作大有裨益。(如有错误和建议请大家评论告知)版本控制系统 VCS → Version Control System,版本控制系统 → 一个跟踪文件变化、记录修订情况、协…

leetcode hot 02

解题思路:找祖先从底向上递归后序遍历查找,遇到p,q或者空节点就直接返回对应值,当某个节点的左子树、右子树都返回了值,那么就说明该节点就是最近祖先节点,然后把该节点的值继续往上传,直到根节点返回结果。 /*** Definition for a binary tree node.* public class Tre…

Linux介绍及使用

一、linux介绍 1、Linux是一个免费、开源的操作系统,能多用户、多任务、支持多线程和多CPU的操作系统,相对windows更加稳定,在unix系统的基础上开发的系统; 注解:(1)免费:不要钱 (2)源代码公开 (3)多用户 :可以在不同用户操作 (4)多任务:同时执行多个任务 …

Maven 生命周期 Test 阶段遇到的一些问题

Q:无法使用@Test注解,报错 A:最初pom.xml中使用的Junit版本为3,Java 5于 2004 年发布,引入了注解作为语言的一部分。而Junit 3 是在这之前发布的,因此它无法使用注解,将pom.xml中的版本号改为<version>4.13.2</version>后问题解决,可使用@TestQ:在Maven启…

18. 信号

一、什么是信号在 Linux 中,信号是一种用于通知进程发生了某种事件的机制。信号可以由内核、其它进程或者命令行工具发送给目标进程。Linux 系统中由多种信号,每种信号都用一个唯一的数值表示。例如,常见的信号如下:SIGINT (2):这是当用户在终端按下 Ctrl+C 时发送给前台进…

【专题】DeepSeek技术颠覆or创新共赢,开启Al算法变革元年报告汇总PDF洞察(附原数据表)

原文链接: https://tecdat.cn/?p=39544 在科技飞速迭代的当下,人工智能领域正经历着深刻变革,AI Agent 的发展尤为引人瞩目。 随着数字化进程的加速,全球数据量呈指数级增长,如同为 AI Agent 的发展提供了丰沃土壤。海量数据不仅为模型训练提供了坚实基础,更驱动着 AI A…