介绍

优质
小牛编辑
143浏览
2023-12-01

也许有很多同学上过 C/C++ 的课后,可以完成一些简单的编程练习,又能在一些网站刷题,但对于如何开发有实际用途的程序可能感到束手无策。本教程希望能以一个简单的项目开发形式,让同学能逐步理解如何从无到有去开发软件。

为什么选择 JSON?因为它足够简单,除基本编程外不需大量技术背景知识。JSON 有标准,可按照标准逐步实现。JSON 也是实际在许多应用上会使用的格式,所以才会有大量的开源库。

这是一个免费、开源的教程,如果你喜欢,也可以打赏鼓励。因为工作及家庭因素,不能保证每篇文章的首发时间,请各为见谅。

对象与目标

教程对象:学习过基本 C/C++ 编程的同学。

通过这个教程,同学可以了解如何从零开始写一个 JSON 库,其特性如下:

  • 符合标准的 JSON 解析器和生成器
  • 手写的递归下降解析器(recursive descent parser)
  • 使用标准 C 语言(C89)
  • 跨平台/编译器(如 Windows/Linux/OS X,vc/gcc/clang)
  • 仅支持 UTF-8 JSON 文本
  • 仅支持以 double 存储 JSON number 类型
  • 解析器和生成器的代码合共少于 500 行

除了围绕 JSON 作为例子,希望能在教程中讲述一些课题:

  • 测试驱动开发(test driven development, TDD)
  • C 语言编程风格
  • 数据结构
  • API 设计
  • 断言
  • Unicode
  • 浮点数
  • Github、CMake、valgrind、Doxygen 等工具

教程大纲

本教程预计分为 9 个单元,第 1-8 个单元附带练习和解答。

  1. 15913(2016/9/15 完成):编译环境、JSON 简介、测试驱动、解析器主要函数及各数据结构。练习 JSON 布尔类型的解析。15914(2016/9/17 完成)。
  2. 15915(2016/9/18 完成):JSON number 的语法。练习 JSON number 类型的校验。15916(2016/9/20 完成)。
  3. 15917(2016/9/22 完成):使用 union 存储 variant、自动扩展的堆栈、JSON string 的语法、valgrind。练习最基本的 JSON string 类型的解析、内存释放。15918(2016/9/27 完成)。
  4. 15919(2016/10/2 完成):Unicode 和 UTF-8 的基本知识、JSON string 的 unicode 处理。练习完成 JSON string 类型的解析。15920(2016/10/6 完成)。
  5. 15921(2016/10/7 完成):JSON array 的语法。练习完成 JSON array 类型的解析、相关内存释放。15922(2016/10/13 完成)。
  6. 15923(2016/10/29 完成):JSON object 的语法、重构 string 解析函数。练习完成 JSON object 的解析、相关内存释放。15924(2016/11/15 完成)。
  7. 15925(2016/12/20 完成):JSON 生成过程、注意事项。练习完成 JSON 生成器。15926(2017/1/5 完成)
  8. 访问:JSON array/object 的访问及修改。练习完成相关功能。
  9. 终点及新开始:加入 nativejson-benchmark 测试,与 RapidJSON 对比及展望。