js jsonParse
const rx_one = /^[\],:{}\s]*$/;
const rx_two = /\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g;
// 匹配合法json符号
// "asd" or 1.23 or 1.3e4 or 1.3e-4 or 1.3e+4 or -10 之类的
const rx_three = /"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g;
// :[
// ,[
const rx_four = /(?:^|:|,)(?:\s*\[)+/g;
// 一些符号的unicode表示法
const rx_dangerous = /[\u0000\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g;
export function jsonParse(text: string, reviver?: Function): any {
// 接受一个文本和一个可选的reviver函数,然后返回
// 如果文本是有效的JSON文本,则为JavaScript值
let j;
function walk(holder: any, key: any) {
// walk方法用于递归遍历结果结构,因此可以进行修改。
let k: string | number;
let v: any;
let value = holder[key];
if (value && typeof value === "object") {
// {} or []
for (k in value) {
if (Object.prototype.hasOwnProperty.call(value, k)) {
v = walk(value, k);
if (v !== undefined) {
value[k] = v;
} else {
delete value[k];
}
}
}
return reviver?.call(holder, key, value);
}
}
// 解析分为四个阶段。 在第一阶段,我们替换某些
// 具有转义序列的Unicode字符。 JavaScript处理许多字符
// 错误地将其静默删除,或将其视为行尾。
text = String(text);
rx_dangerous.lastIndex = 0;
if (rx_dangerous.test(text)) {
// 转义序列的Unicode字符
text = text.replace(rx_dangerous, function(match) {
return "\\u" + ("0000" + match.charCodeAt(0).toString(16)).slice(-4);
});
}
// 在第二阶段,我们针对看起来像正则表达式的文本
// 用于非JSON模式。 我们特别关注"()"和"new"
// 因为它们会引起调用,而"="则可能导致突变
// 但是为了安全起见,我们要拒绝所有意外的形式。
// 为了解决此问题,我们将第二阶段分为4个正则表达式操作
// 严重影响IE和Safari的regexp引擎的效率低下。 首先我们
// 将JSON反斜杠对替换为"@"(非JSON字符)。 第二,我们
// 用"]"字符替换所有简单值标记。 第三,我们删除所有
// 用冒号或逗号或文本开头的方括号。 最后,
// 我们希望看到其余字符只是空格或"]"或
// "."或":"或"{"或"}". 如果是这样,那么该文本对于eval是安全的。
if (
rx_one.test(
/*`{"name": "ajanuw"}` => `{]: ]}` */
text
.replace(rx_two, "@")
.replace(rx_three, "]")
.replace(rx_four, "")
)
) {
// 在第三阶段,我们使用eval函数将文本编译为
// JavaScript结构。 "{"运算符存在句法歧义
// 在JavaScript中:它可以开始一个块或一个对象文字。 我们包装文字
// 尽可能消除歧义
j = eval(`(${text})`);
// 在可选的第四阶段,我们递归遍历新结构,
// 每个名称/值对到reviver函数进行可能的转换
return typeof reviver === "function"
? walk(
{
"": j
},
""
)
: j;
}
// 如果文本不是JSON可解析的,则抛出SyntaxError。
throw new SyntaxError("json parse error!!");
}
const r = jsonParse(`{"name": "ajanuw"}`);
console.log({ result: r });
js jsonParse的更多相关文章
- 原生js封装dom操作库
var utils = (function(window) { var flag = "getComputedStyle" in window; function win(attr ...
- JS操作JSON常用方法
一.JSON字符串的替换 工作经常遇到这样的字符串,如下: 需要经过替换后,才能从字符串转化成JSON对象.这里我们需要用JS实现replaceAll的功能, 将所有的 ' \\" ' 替换 ...
- 【JavaScript】使用纯JS实现多张图片的懒加载(附源码)
一.效果图如下 上面的效果图,效果需求如下 1.还没加载图片的时候,默认显示加载图片背景图 2.刚开始进入页面,自动加载第一屏幕的图片 3.下拉界面,当一张图片容器完全显露出屏幕,即刻加载图片,替换背 ...
- json代码——json序列化,json-parse,JSONstringify格式化输出,虚拟DOM
JS对象转为类似json的字符串,对象->字符串叫序列化,字符串->对象 是反序列化 ㈠json序列化 <script> var shy = new Object() ...
- 在 Node.js 中处理大 JSON 文件
在 Node.js 中处理大 JSON 文件 场景描述 问题一: 假设现在有一个场景,有一个大的 JSON 文件,需要读取每一条数据经过处理之后输出到一个文件或生成报表数据,怎么能够流式的每次读取一条 ...
- Node.js精进(3)——流
在 JavaScript 中,一般只处理字符串层面的数据,但是在 Node.js 中,需要处理网络.文件等二进制数据. 由此,引入了Buffer和Stream的概念,两者都是字节层面的操作. Buff ...
- Vue.js 和 MVVM 小细节
MVVM 是Model-View-ViewModel 的缩写,它是一种基于前端开发的架构模式,其核心是提供对View 和 ViewModel 的双向数据绑定,这使得ViewModel 的状态改变可以自 ...
- js学习笔记:操作iframe
iframe可以说是比较老得话题了,而且网上也基本上在说少用iframe,其原因大致为:堵塞页面加载.安全问题.兼容性问题.搜索引擎抓取不到等等,不过相对于这些缺点,iframe的优点更牛,跨域请求. ...
- js学习笔记:webpack基础入门(一)
之前听说过webpack,今天想正式的接触一下,先跟着webpack的官方用户指南走: 在这里有: 如何安装webpack 如何使用webpack 如何使用loader 如何使用webpack的开发者 ...
随机推荐
- CSS居中的常用方式以及优缺点
前言 居中是页面开发中经常遇到的问题. 使用合适的.简单的.兼容性好的居中方式是我们页面仔在整个工作生涯中都要面对的问题. text-align:center 来看这个例子,一张图片和文字进行居中.如 ...
- python几个练习(素数、斐波那契数列)
随机输入求素数: x = int(input("please enter the number:")) if x != 1: for i in range(2, x): if x ...
- 搭建Spring相关框架后,配置信息文件头部出现红色小×错误。
问题描述: 在搭建关于Spring相关框架的时候,在applicationContext.xml配置文件和servlet-mvc.xml配件文件的头部会出现一个红色的小X错误: 错误描述: Refer ...
- Cookie (设置与读取、超时设置、指定路径、显示用户上次登录时间)
Cooike简介 Cookie 是在 HTTP 协议下,服务器或脚本可以维护客户工作站上信息的一种方式.Cookie 是由 Web 服务器保存在用户浏览器(客户端)上的小文本文件,它可以包含有关用户的 ...
- redis学习教程一《Redis的安装和配置》
redis学习教程一<Redis的安装和配置> Redis的优点 以下是Redis的一些优点. 异常快 - Redis非常快,每秒可执行大约110000次的设置(SET)操作,每秒大约可执 ...
- TypeScript 的 Substitutability
Substitutability 中文含义是 可代替性,这个词我未在 TypeScript 的语言特性相关文档上看到,百度.谷歌搜索也寥寥无几.仅在TypeScript FAQ 找到相关描述. 有关类 ...
- Kwp2000协议的应用(硬件原理使用篇)
作者:良知犹存 转载授权以及围观:欢迎添加微信:becom_me 发现K线没有过多的文章描述,作为一个开发过K线的人,不写些文章帮助后来的人岂不是太浪费开发经验了呢. 总述 KWP2000是一 ...
- getline()的使用注意
在使用getline读入一整行时,若是前面是使用getchar().cin这类读入了一个字母,但是不会读入后续换行\n符号或者空格的输入时,再接getline()就容易出现问题. 这是因为输入数字之后 ...
- [CCPC2019网络赛] 1008-Fishing Master(思维)
>传送门< 题意:现在需要捕$n$条鱼并且将它们煮熟来吃.每条鱼要煮相应的时间才能吃(可以多煮一会),锅里每次只能煮一条鱼,捕一条鱼的时间是相同的,但是在捕鱼的时间内不能做其他事(比如换一 ...
- CF 1405E Fixed Point Removal【线段树上二分】
CF 1405E Fixed Point Removal[线段树上二分] 题意: 给定长度为\(n\)的序列\(A\),每次操作可以把\(A_i = i\)(即值等于其下标)的数删掉,然后剩下的数组 ...