js实现 JSON数据格式化的两种方法

news2024/9/20 10:37:31

本次方法不使用JS库直接采用原生JS

完整HTML代码如下,您可以复制代码然后,新建一个.html的网页进行保存即可体验


<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
	</head>
	<body>
		<script type="text/javascript">
 
			function acb()
			{ 
				var jsontxt=	 document.getElementById('unicodetxt').value;	
				console.log(jsontxt);
				//document.getElementById('res').value= formatJson(JSON.stringify( JSON.parse( jsontxt)));	
				document.getElementById('res').value= JSON.stringify( JSON.parse( jsontxt),null,2);	
			}
			
			// 格式方法
			// 公共方法
			function transitionJsonToString (jsonObj, callback) {
				// 转换后的jsonObj受体对象
				var _jsonObj = null;
				// 判断传入的jsonObj对象是不是字符串,如果是字符串需要先转换为对象,再转换为字符串,这样做是为了保证转换后的字符串为双引号
				if (Object.prototype.toString.call(jsonObj) !== "[object String]") {
					try {
						_jsonObj = JSON.stringify(jsonObj);
					} catch (error) {
						// 转换失败错误信息
						console.error('您传递的json数据格式有误,请核对...');
						console.error(error);
						callback(error);
					}
				} else {
					try {
						jsonObj = jsonObj.replace(/(\')/g, '\"');
						_jsonObj = JSON.stringify(JSON.parse(jsonObj));
					} catch (error) {
						// 转换失败错误信息
						console.error('您传递的json数据格式有误,请核对...');
						console.error(error);
						callback(error);
					}
				}
				return _jsonObj;
			}
			// callback为数据格式化错误的时候处理函数
			function formatJson (jsonObj, callback) {
				// 正则表达式匹配规则变量
				var reg = null;
				// 转换后的字符串变量
				var formatted = '';
				// 换行缩进位数
				var pad = 0;
				// 一个tab对应空格位数
				var PADDING = '    ';
				// json对象转换为字符串变量
				var jsonString = transitionJsonToString(jsonObj, callback);
				if (!jsonString) {
					return jsonString;
				}
				// 存储需要特殊处理的字符串段
				var _index = [];
				// 存储需要特殊处理的“再数组中的开始位置变量索引
				var _indexStart = null;
				// 存储需要特殊处理的“再数组中的结束位置变量索引
				var _indexEnd = null;
				// 将jsonString字符串内容通过\r\n符分割成数组
				var jsonArray = [];
			    // 正则匹配到{,}符号则在两边添加回车换行
				jsonString = jsonString.replace(/([\{\}])/g, '\r\n$1\r\n');
				// 正则匹配到[,]符号则在两边添加回车换行
				jsonString = jsonString.replace(/([\[\]])/g, '\r\n$1\r\n');
				// 正则匹配到,符号则在两边添加回车换行
				jsonString = jsonString.replace(/(\,)/g, '$1\r\n');
				// 正则匹配到要超过一行的换行需要改为一行
				jsonString = jsonString.replace(/(\r\n\r\n)/g, '\r\n');
				// 正则匹配到单独处于一行的,符号时需要去掉换行,将,置于同行
				jsonString = jsonString.replace(/\r\n\,/g, ',');
				// 特殊处理双引号中的内容
				jsonArray = jsonString.split('\r\n');
				jsonArray.forEach(function (node, index) {
					// 获取当前字符串段中"的数量
					var num = node.match(/\"/g) ? node.match(/\"/g).length : 0;
					// 判断num是否为奇数来确定是否需要特殊处理
					if (num % 2 && !_indexStart) {
						_indexStart = index
					}
					if (num % 2 && _indexStart && _indexStart != index) {
						_indexEnd = index
					}
					// 将需要特殊处理的字符串段的其实位置和结束位置信息存入,并对应重置开始时和结束变量
					if (_indexStart && _indexEnd) {
						_index.push({
							start: _indexStart,
							end: _indexEnd
						})
						_indexStart = null
						_indexEnd = null
					}
				})
				// 开始处理双引号中的内容,将多余的"去除
				_index.reverse().forEach(function (item, index) {
					var newArray = jsonArray.slice(item.start, item.end + 1)
					jsonArray.splice(item.start, item.end + 1 - item.start, newArray.join(''))
				})
				// 奖处理后的数组通过\r\n连接符重组为字符串
				jsonString = jsonArray.join('\r\n');
				// 将匹配到:后为回车换行加大括号替换为冒号加大括号
				jsonString = jsonString.replace(/\:\r\n\{/g, ':{');
				// 将匹配到:后为回车换行加中括号替换为冒号加中括号
				jsonString = jsonString.replace(/\:\r\n\[/g, ':[');
				// 将上述转换后的字符串再次以\r\n分割成数组
				jsonArray = jsonString.split('\r\n');
			    // 将转换完成的字符串根据PADDING值来组合成最终的形态
			    jsonArray.forEach(function (item, index) {
					console.log(item)
			    	var i = 0;
			    	// 表示缩进的位数,以tab作为计数单位
					var indent = 0;
					// 表示缩进的位数,以空格作为计数单位
					var padding = '';
					if (item.match(/\{$/) || item.match(/\[$/)) {
						// 匹配到以{和[结尾的时候indent加1
						indent += 1
					} else if (item.match(/\}$/) || item.match(/\]$/) || item.match(/\},$/) || item.match(/\],$/)) {
						// 匹配到以}和]结尾的时候indent减1
						if (pad !== 0) {
							pad -= 1
						}
			        } else {
			            indent = 0
			        }
			        for (i = 0; i < pad; i++) {
			            padding += PADDING
			        }
			        formatted += padding + item + '\r\n'
					pad += indent
			   	})
				// 返回的数据需要去除两边的空格
				return formatted.trim();
			}

			
		</script>
		<textarea  type="text"   multiple="true" style="height: 200px; width: 100%;" id="unicodetxt" > </textarea>
		<br />
		<button onclick="acb()">转换</button>
		<div>
				<textarea  type="text"  multiple="true" style="height: 400px; width: 100%;"  id="res"> </textarea>
			
		</div>
	</body>
</html>

方法1

使用 JSON.stringify 的第二个参数来指定缩进空格数,以便直接格式化 JSON 数据。这样可以避免在代码中手动处理 JSON 字符串的格式化,使代码更简洁和易读。

方法2使用自定义函数: formatJson

formatJson(JSON.stringify( JSON.parse( jsontxt)));    

实际运行效果

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

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

相关文章

Xcode 16 beta3 真机调试找不到 Apple Watch 的尝试解决

很多小伙伴们想用 Xcode 在 Apple Watch 真机上调试运行 App 时却发现&#xff1a;在 Xcode 设备管理器中压根找不到对应的 Apple Watch 设备。 大家是否已将 Apple Watch 和 Mac 都重启一万多遍了&#xff0c;还是束手无策。 Apple Watch not showing in XCodeApple Watch wo…

android13 文件管理器无法安装apk 奔溃问题

总纲 android13 rom 开发总纲说明 目录 1.前言 2.我们简单写个apk测试下 3.排查客户apk 4.frameworks源码排查 5.编译验证 6.彩蛋 1.前言 客户提供的文件管理apk不能安装apk文件,一点击就奔溃。 2.我们简单写个apk测试下 private void installApk(File apkFile) {i…

从0开始学习informer

目录 informer特点informer原理attention计算KL散度 backbone网络部分encoder输入输出部分embadding这里就不讲了 和transfomer一样EncoderStack decoder部分接下来就是最关键的结构 关于如何将输入经过注意力得到结果 结束&#xff0c;代码会放到下一篇讲 这里是原理 informer…

[Vulnhub] Sedna BuilderEngine-CMS+Kernel权限提升

信息收集 IP AddressOpening Ports192.168.8.104TCP:22, 53, 80, 110, 111, 139, 143, 445, 993, 995, 8080, 55679 $ nmap -p- 192.168.8.104 --min-rate 1000 -sC -sV PORT STATE SERVICE VERSION 22/tcp open ssh OpenSSH 6.6.1p1 Ubuntu 2ubuntu2 …

PTX入门教程与实战

PTX入门教程 官方文档的目录结构 1 PTX指令 官方文档链接 1.1 指令形式 指令的操作数个数从0-4不等&#xff0c;其中d代表的是目的操作数&#xff0c;a,b,c是源操作数 p opcode;p opcode a;p opcode d, a;p opcode d, a, b;p opcode d, a, b, c;2 编程模型 2.…

人工智能算法工程师(中级)课程9-PyTorch神经网络之全连接神经网络实战与代码详解

大家好&#xff0c;我是微学AI&#xff0c;今天给大家介绍一下人工智能算法工程师(中级)课程9-PyTorch神经网络之全连接神经网络实战与代码详解。本文将给大家展示全连接神经网络与代码详解&#xff0c;包括全连接模型的设计、数学原理介绍&#xff0c;并从手写数字识别到猫狗识…

JVM监控及诊断工具-命令行篇-jstat命令介绍

JVM监控及诊断工具-命令行篇01-jstat&#xff1a;查看JVM统计信息 一 基本情况二 基本语法2.1 option参数1. 类装载相关的&#xff1a;2. 垃圾回收相关的-gc&#xff1a;显示与GC相关的堆信息。包括Eden区、两个Survivor区、老年代、永久代等的容量、已用空间、GC时间合计等信息…

基于51单片机的多路报警器Protues仿真设计

一、设计背景 随着社会的发展和技术的进步&#xff0c;安全问题越来越受到重视。各种工业设施、家庭、商业场所以及公共场所的安全保障成为了重点。报警器作为安全防护系统的重要组成部分&#xff0c;在预防和及时应对各种突发事件中发挥着至关重要的作用。传统的报警器通常在功…

【C++】哈希(散列)表

目录 一、哈希表的基本概念1.哈希的概念2.哈希冲突2.1 哈希函数2.2 哈希冲突的解决办法2.2.1 闭散列2.2.2 开散列 二、哈希表的实现1.闭散列的实现1.1 闭散列的结构1.2 闭散列的插入1.3 闭散列的删除1.4 闭散列的查找 2.开散列的实现2.1 key值不能取模的情况2.2 开散列的结构2.…

Redis的安装配置及IDEA中使用

目录 一、安装redis&#xff0c;配置redis.conf 1.安装gcc 2.将redis的压缩包放到指定位置解压 [如下面放在 /opt 目录下] 3.编译安装 4.配置redis.conf文件 5.开机自启 二、解决虚拟机本地可以连接redis但是主机不能连接redis 1.虚拟机网络适配器网络连接设置为桥接模式…

STM32智能空气质量监测系统教程

目录 引言环境准备智能空气质量监测系统基础代码实现&#xff1a;实现智能空气质量监测系统 4.1 数据采集模块 4.2 数据处理与控制模块 4.3 通信与网络系统实现 4.4 用户界面与数据可视化应用场景&#xff1a;空气质量监测与优化问题解决方案与优化收尾与总结 1. 引言 智能空…

【练习】分治--归并排序

&#x1f3a5; 个人主页&#xff1a;Dikz12&#x1f525;个人专栏&#xff1a;算法(Java)&#x1f4d5;格言&#xff1a;吾愚多不敏&#xff0c;而愿加学欢迎大家&#x1f44d;点赞✍评论⭐收藏 目录 归并排序 代码实现 交易逆序对的总数 题目描述 ​编辑 题解 代码实…

基于Vue和UCharts的前端组件化开发:实现高效、可维护的词云图与进度条组件

基于Vue和UCharts的前端组件化开发&#xff1a;实现高效、可维护的词云图与进度条组件 摘要 随着前端技术的迅速发展和业务场景的日益复杂&#xff0c;传统的整块应用开发方式已无法满足现代开发的需求。组件化开发作为一种有效的解决方案&#xff0c;能够将系统拆分为独立、…

汽车的驱动力,是驱动汽车行驶的力吗?

一、地面对驱动轮的反作用力&#xff1f; 汽车发动机产生的转矩&#xff0c;经传动系传至驱动轮上。此时作用于驱动轮上的转矩Tt产生一个对地面的圆周力F0&#xff0c;地面对驱动轮的反作用力Ft(方向与F0相反)即是驱动汽车的外力&#xff0c;此外力称为汽车的驱动力。 即汽车…

C++中跨平台类的设计方法

目录 1.引言 2.具体实现 2.1.单一继承实现 2.2.桥接方式实现 3.总结 1.引言 进行C代码的跨平台设计&#xff0c;主要目标是确保编写的代码能够在不同的操作系统&#xff08;如Windows、Linux、macOS等&#xff09;和硬件架构&#xff08;如x86、ARM等&#xff09;上无缝运…

leetcode--二叉树中的最大路径和

leetcode地址&#xff1a;二叉树中的最大路径和 二叉树中的 路径 被定义为一条节点序列&#xff0c;序列中每对相邻节点之间都存在一条边。同一个节点在一条路径序列中 至多出现一次 。该路径 至少包含一个 节点&#xff0c;且不一定经过根节点。 路径和 是路径中各节点值的总…

编译x-Wrt 全过程

参考自;​​​​​​c编译教程 | All about X-Wrt 需要详细了解的小伙伴还请参看原文 ^-^ 概念&#xff1a; x-wrt&#xff08;基于openwrt深度定制的发行版本&#xff09; 编译系统: ubuntu22.04 注意&#xff1a; 特别注意的是&#xff0c;整个编译过程&#xff0c;都是用 …

C到C嘎嘎的衔接篇

本篇文章&#xff0c;是帮助大家从C向C嘎嘎的过渡&#xff0c;那么我们直接开始吧 不知道大家是否有这样一个问题&#xff0c;学完C的时候感觉还能听懂&#xff0c;但是听C嘎嘎感觉就有点难度或者说很难听懂&#xff0c;那么本篇文章就是帮助大家从C过渡到C嘎嘎。 C嘎嘎与C的区…

代码随想录算法训练营第三十四天|322. 零钱兑换、279.完全平方数

322. 零钱兑换 给定不同面额的硬币 coins 和一个总金额 amount。编写一个函数来计算可以凑成总金额所需的最少的硬币个数。如果没有任何一种硬币组合能组成总金额&#xff0c;返回 -1。 dp[j]凑足总额为j的方法有dp[j]个。 递推公式&#xff1a;凑足金额为j-coins[i]的方法有d…

linux下安装cutecom串口助手;centos安装cutecom串口助手;rpm安装包安装cutecom串口助手

在支持apt-get的系统下安装 在终端命令行中输入&#xff1a; sudo apt-get install cutecom 安装好后输入 sudo cutecom 就可以了 关于如何使用&#xff0c;可以看这个https://www.cnblogs.com/xingboy/p/14388610.html 如果你的电脑不支持apt-get。 那我们就通过安装包…