注:好记性不如烂笔头,在看Milo Yip 的从零开始的 JSON 库教程,学习下编程技术,把在学习过程中遇到的自己觉得很有意思的地方给记录了下来,基本是 ctrl + c ctrl + v。所以如果需要看他的教程学习的同学,请移步https://zhuanlan.zhihu.com/json-tutorial。
从零开始的 JSON 库教程(一):启程
作者:Milo Yip
链接:https://zhuanlan.zhihu.com/p/22460835
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
我们要实现的 JSON 库,主要是完成 3 个需求:
把 JSON 文本解析为一个树状数据结构(parse)。
提供接口访问该数据结构(access)。
把数据结构转换成 JSON 文本(stringify)。
在本单元中,我们只实现最简单的 null 和 boolean 解析。
JSON 是什么
JSON 是树状结构,而 JSON 只包含 6 种数据类型:
- null: 表示为 null
- boolean: 表示为 true 或 false
- number: 一般的浮点数表示方式,在下一单元详细说明
- string: 表示为 “…”
- array: 表示为 [ … ]
- object: 表示为 { … }
我们要实现的 JSON 库,主要是完成 3 个需求:
- 把 JSON 文本解析为一个树状数据结构(parse)。
- 提供接口访问该数据结构(access)。
- 把数据结构转换成 JSON 文本(stringify)。
搭建编译环境
头文件与 API 设计
C 语言有头文件的概念,需要使用 #include去引入头文件中的类型声明和函数声明。但由于头文件也可以 #include 其他头文件,为避免重复声明,通常会利用宏加入 include 防范(include guard):
#ifndef LEPTJSON_H__
#define LEPTJSON_H__
/* ... */
#endif /* LEPTJSON_H__ */
宏的名字必须是唯一的,通常习惯以 _H__
作为后缀。由于 leptjson 只有一个头文件,可以简单命名为 LEPTJSON_H__
。如果项目有多个文件或目录结构,可以用 项目名称_目录_文件名称_H__
这种命名方式。
JSON 语法子集
下面是此单元的 JSON 语法子集,使用 RFC7159 中的 ABNF 表示:
JSON-text = ws value ws
ws = *(%x20 / %x09 / %x0A / %x0D)
value = null / false / true
null = "null"
false = "false"
true = "true"
当中 %xhh 表示以 16 进制表示的字符,/ 是多选一,* 是零或多个,() 用于分组。
单元测试
M大关于单元测试的讲解&