一个解析非标JSON数据的思路 - [Flex-Tools]

问题

我们在Typescript/Javascript中要将一个JSON字符串解析为JSON对象,一般会采用JSON.parse。如果追求解析性能,在Nodejs中也可能会使用一些第三方的库。但是在很多场合,我们会更在意容错性,比如:

`{
	username:"fisher",	
	password:'123",
	age:18,
}`

如果使用JSON.parse解析上述字符串,则会出错。因为JSON.parse只能解析严格的JSON字符串,要求所有Key必须使用"..."包裹,未尾不能有,等,规范比较严格。在某些场合就比较麻烦,我们希望解析能更加智能此,能处理一些非标问题,比如:

  • keyvalue可以混合使用"..."'...'包裹
  • 能处理尾部的,
  • 处理一些无意中混入的中文全角符号

思路

第1步:匹配未添加逗号的行

使用以下正则表达式匹配行未添加正则表达式

const addLineCommaRegex = /(?<!(\s*\,\s*)|([\[\{\}]\s*))\n(?!\s*\}\s*)/gm;
let resultStr = str.replaceAll(addLineCommaRegex, ",\n");

第2步:匹配使用""或’'包裹字符串

使用正则表达式使用"..."'...'包裹字符串,然后使用endcodeURI进行编码。编码的目的是因为"..."'...'内部可能包含一系列的符号或转义符等不利于进行后续的正则匹配。

const strVarRegex = /((?<!\\)\"|\')(.*?)((?<!\\)\1)/gm;
resultStr = resultStr.replaceAll(strVarRegex, (s, begin, value, end) => {
	return `\"${encodeURI(value)}\"`;
});

第3步:为没有"…“包裹key加上”…"

const badKeyRegex = /([\s\[\,\{\b]{1})(?<!\"])(\w+)(?!\")(\s*\:)/gm;
resultStr = resultStr.replaceAll(badKeyRegex, (s, p1, value, p2) => {
	return `${p1}\"${value}\"${p2}`;
});

第4步:将一些全角字符转换为半角字符

将一些全角字符转换为半角字符,同时使用decodeURL进行解码恢复。

	resultStr = resultStr.replaceAll(",", ",").replaceAll("“", '"').replaceAll("”", '"');
	return JSON.parse(resultStr, (key, value) => {
		if (typeof value == "string") value = decodeURI(value);
		if (callback) {
			return callback(key, value);
		}
		return value;
	});

小结

完整函数请访问FlexTools

以下是我的一大波开源项目推荐:

  • 3
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值