从零开始的Jason(一)

    最近关注了叶劲锋大大的知乎专栏“
从零开始的 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 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。叶大采用的是简易的测试

附叶大教程

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值