原网址:从零开始的 JSON 库教程 - 知乎
JSON 是什么?
JSON(JavaScript Object Notation)是一个用于数据交换的文本格式。
JSON 是树状结构,只包含 6 种数据类型:
- null: 表示为 null
- boolean: 表示为 true 或 false
- number: 一般的浮点数表示方式,在下一单元详细说明
- string: 表示为 "..."
- array: 表示为 [ ... ]
- object: 表示为 { ... }
我们要实现的 JSON 库,主要是完成 3 个需求:
- 把 JSON 文本解析为一个树状数据结构(parse)。
- 提供接口访问该数据结构(access)。
- 把数据结构转换成 JSON 文本(stringify)。
JSON 中有 6 种数据类型,如果把 true 和 false 当作两个类型就是 7 种,我们为此声明一个枚举类型(enumeration type):
typedef enum {
LEPT_NULL,
LEPT_FALSE,
LEPT_TRUE,
LEPT_NUMBER,
LEPT_STRING,
LEPT_ARRAY,
LEPT_OBJECT
} lept_type;
JSON 是一个树形结构,我们最终需要实现一个树的数据结构,每个节点使用 lept_value 结构体表示,我们会称它为一个 JSON 值(JSON value)。
typedef struct {
lept_type type;
}lept_value;
我们现在只需要两个 API 函数,一个是解析 JSON:
int lept_parse(lept_value* v, const char* json);
返回值是以下这些枚举值,无错误会返回 LEPT_PARSE_OK。
enum {
LEPT_PARSE_OK = 0,
LEPT_PARSE_EXPECT_VALUE,
LEPT_PARSE_INVALID_VALUE,
LEPT_PARSE_ROOT_NOT_SINGULAR
};
- 若一个 JSON 只含有空白,传回 LEPT_PARSE_EXPECT_VALUE。
- 若一个值之后,在空白之后还有其他字符,传回 LEPT_PARSE_ROOT_NOT_SINGULAR。
- 若值不是那三种字面值,传回 LEPT_PARSE_INVALID_VALUE。
现时我们只需要一个访问结果的函数,就是获取其类型:
lept_type lept_get_type(const lept_value* v);
为了减少解析函数之间传递多个参数,我们把json数据都放进一个 lept_context 结构体:
typedef struct {
const char* json;
}lept_context;