从零开始的 JSON 库教程(一):启程 学习整理笔记

原网址:从零开始的 JSON 库教程 - 知乎

 JSON 是什么?

JSON(JavaScript Object Notation)是一个用于数据交换的文本格式。

JSON 是树状结构,只包含 6 种数据类型:

  • null: 表示为 null
  • boolean: 表示为 true 或 false
  • number: 一般的浮点数表示方式,在下一单元详细说明
  • string: 表示为 "..."
  • array: 表示为 [ ... ]
  • object: 表示为 { ... }

我们要实现的 JSON 库,主要是完成 3 个需求:

  1. 把 JSON 文本解析为一个树状数据结构(parse)。
  2. 提供接口访问该数据结构(access)。
  3. 把数据结构转换成 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;

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值