最近关注了叶劲锋大大的知乎专栏“
实现一个简易的Json库需求:
解析API:
当中 %xhh 表示以 16 进制表示的字符,/ 是多选一,* 是零或多个,( ) 用于分组。
在这个 JSON 语法子集下,我们定义 3 种错误码:
若一个 JSON 只含有空白,传回 LEPT_PARSE_EXPECT_VALUE。
若一个值之后,在空白之后还有其他字符,传回 LEPT_PARSE_ROOT_NOT_SINGULAR。
若值不是那三种字面值,传回 LEPT_PARSE_INVALID_VALUE。
从零开始的 JSON 库教程”,主要做一些笔记
JSON是什么?
JSON(JavaScript Object Notation)是一个用于数据交换的文本格式,现时的标准为ECMA-404。
先来看一个Jason结构:
{
"title": "Design Patterns",
"subtitle": "Elements of Reusable Object-Oriented Software",
"author": [
"Erich Gamma",
"Richard Helm",
"Ralph Johnson",
"John Vlissides"
],
"year": 2009,
"weight": 1.8,
"hardcover": true,
"publisher": {
"Company": "Pearson Education",
"Country": "India"
},
"website": null
}
实现一个简易的Json库需求:
把 JSON 文本解析为一个树状数据结构(parse)。
提供接口访问该数据结构(access)。
把数据结构转换成 JSON 文本(stringify)。
API:
JSON中数据类型设计:
typedef enum { LEPT_NULL, LEPT_FALSE, LEPT_TRUE, LEPT_NUMBER, LEPT_STRING, LEPT_ARRAY, LEPT_OBJECT } lept_type;
JSON树状结构初始设计:
typedef struct {
lept_type type;
}lept_value;
解析API:
int lept_parse(lept_value* v, const char* json);
enum {
LEPT_PARSE_OK = 0,
LEPT_PARSE_EXPECT_VALUE,
LEPT_PARSE_INVALID_VALUE,
LEPT_PARSE_ROOT_NOT_SINGULAR
};
lept_type lept_get_type(const lept_value* v);
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 进制表示的字符,/ 是多选一,* 是零或多个,( ) 用于分组。
在这个 JSON 语法子集下,我们定义 3 种错误码:
若一个 JSON 只含有空白,传回 LEPT_PARSE_EXPECT_VALUE。
若一个值之后,在空白之后还有其他字符,传回 LEPT_PARSE_ROOT_NOT_SINGULAR。
若值不是那三种字面值,传回 LEPT_PARSE_INVALID_VALUE。
单元测试:
c++ 有 gtest。叶大采用的是简易的测试
附叶大教程