一起来写一个JSON 解析器

最近想到写一个json解释器,在前端开发中,我们经常使用第三方库或现在新版本的浏览器已经默认支持了。JSON的操作API,一般我们在前端开发中,可能默认会想到用如下方式来处理json数据

  • 浏览器默认都支持eval接口
  const jsonData = eval(`{${jsonData}}`)
  console.log(jsonData)
  • 高版本的浏览器
JSON.parse 解析json,返回一个json格式
JSON.stringify encode json, 由对象生产一个json格式的字符串

如何自己写一个json解释器呢

标准token
string
number
boolean
null
[
]
{
}
,
:

第一眼有这个想法,还是有一点点懵逼,感觉无从下手,但是想到既然是一种规范,肯定有章可以寻找, 于是到了编译原理,找到里面的关键token,随后我仔细查询了 json的标准 ,有如下标准token

标准token
string
number
boolean
null
[
]
{
}
,
:

于是想到了,先怎么从json字符串中解析出,一段标准的,可以分析的词法解析后的token序列

词法分析

例如: json字符串是{"a": "bb", "c": ["aa" ,"dd"]},经过词法分析后,应该变成

"{" "a" ":" "bb" "," "c" ":" "[" "aa" "," "dd" "]" "}"

语法分析

然后在由生产的token序列,按照json的语法规则,组装成一个js对象。

这个只是最初的一个想法,但是再编码过程中发现,在语法分析的时候,遇到一个{, 开始入栈,声明一个对象,开始使用栈来完成还原,发现对象还可以包裹对象,操作层次很深,就想到了用递归来实现,借助js的动态申明变量的特性。

递归实现

利用栈来还原操作逻辑,正在整理看看怎么实现,慢慢补上

你可能感兴趣的:(一起来写一个JSON 解析器)