简单来说,输入字符串 --> 解析到特定结构体中 --> 从结构体(DOM)获取值 ; 另一个功能:能够从结构体中恢复成一个Json字符串 (stringnify)
注:关于命名风格统一
-
兼容UTF-8编码
-
使用简单
- 可以改用使用unordered_multimap实现object对象的存储结构
解析器可以设计为递归式或者迭代式
- 递归式解析器较快,但是极端情况下可能会出现栈溢出
- 迭代时解析器使用自定义的堆栈去维持解析状态
本项目实现的方式暂时设定为递归式
JSON是一个树状的数据结构,每个节点使用 Value
结构体表示,称为Json Value。为不同的节点类型设计一个enum,这个enum种共7种类型,包括:
{NULL, FALSE, TRUE, NUMBER, STRING, ARRAY, OBJECT}
(1) 首先实现解析 null, true, false
typedef enum {NULL, FALSE, TRUE, NUMBER, STRING, ARRAY, OBJECT} ValueType;
struct Value{
ValueType _type;
}
最基本的方法是 int parse(Value* v, const char* json);
返回值 ParseState
typedef enum {PARSE_OK, PARSE_EXPECT_VALUE, PARSE_INVALID_VALUE, PARSE_ROOT_NOT_SINGULAR} ParseState;
int parse(Value* v, const char* json);
//获取节点的类型
ValueType getType(Value* v);
关于状态码的含义详细
传入解析函数的应该是 const char* 为了避免修改输入字符串 parse
更多的设计思路查看各个分目录文档
- 类和结构首字母大写,使用驼峰式命名规则
- 使用小写加下划线命名函数;宏定义用全大写
- 变量首字母小写
- 类私有成员使用前下划线表示
- 全局变量用g开头
- 成员函数使用小写开头,