从零开始的Jason(一)

来源:互联网 发布:淘宝客网站推广教程 编辑:程序博客网 时间:2024/05/16 02:42
    最近关注了叶劲锋大大的知乎专栏“
从零开始的 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};


获取类型API:
lept_type lept_get_type(const lept_value* v);


语法

 JSON 语法子集,使用 RFC7159 中的 ABNF 表示:


JSON-text = ws value wsws = *(%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。叶大采用的是简易的测试

附叶大教程

原创粉丝点击