標籤:

從零開始的 JSON 庫教程

也許有很多同學上過 C/C++ 的課後,可以完成一些簡單的編程練習,又能在一些網站刷題,但對於如何開發有實際用途的程序可能感到束手無策。本教程希望能以一個簡單的項目開發形式,讓同學能逐步理解如何從無到有去開發軟體。

為什麼選擇 JSON?因為它足夠簡單,除基本編程外不需大量技術背景知識。JSON 有標準,可按照標準逐步實現。JSON 也是實際在許多應用上會使用的格式,所以才會有大量的開源庫。

這是一個免費、開源的教程,如果你喜歡,也可以打賞鼓勵。因為工作及家庭因素,不能保證每篇文章的首發時間,請各位見諒。

(題圖 Photo by Carl Cerstrand)

對象與目標

教程對象:學習過基本 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. 啟程(2016/9/15 完成):編譯環境、JSON 簡介、測試驅動開發、解析器主要函數及各數據結構。練習 JSON 布爾類型的解析。啟程解答編(2016/9/17 完成)。
  2. 解析數字(2016/9/18 完成):JSON number 的語法。練習 JSON number 類型的校驗。解析數字解答篇(2016/9/20 完成)

  3. 解析字元串(2016/9/22 完成):使用 union 存儲 variant、自動擴展的堆棧、JSON string 的語法、valgrind。練習最基本的 JSON string 類型的解析、內存釋放。解析字元串解答篇 (2016/9/27 完成)

  4. Unicode(2016/10/2 完成):Unicode 和 UTF-8 的基本知識、JSON string 的 unicode 處理。練習完成 JSON string 類型的解析。Unicode 解答篇(2016/10/6 完成)

  5. 解析數組(2016/10/8 完成):JSON array 的語法。練習完成 JSON array 類型的解析、相關內存釋放。解析數組解答篇(2016/10/13 完成)

  6. 解析對象(2016/10/29 完成):JSON object 的語法、重構 string 解析函數。練習完成 JSON object 的解析、相關內存釋放。解析對象解答篇(2016/11/15 完成)

  7. 生成器:JSON 生成過程、注意事項。練習完成 JSON 生成器。

  8. 訪問:JSON array/object 的訪問及修改。練習完成相關功能。

  9. 終點及新開始:加入 nativejson-benchmark 測試,與 RapidJSON 對比及展望。

關於作者

葉勁峰(Milo Yip)現任騰訊 T4 專家、互動娛樂事業群魔方工作室群前台技術總監。他獲得香港大學認知科學學士(BCogSc)、香港中文大學系統工程及工程管理哲學碩士(MPhil)。他是《遊戲引擎架構》譯者、《C++ Primer 中文版(第五版)》審校。他曾參與《天涯明月刀》、《斗戰神》、《愛麗絲:瘋狂回歸》、《美食從天降》、《王子傳奇》等遊戲項目,以及多個遊戲引擎及中間件的研發。他是開源項目 RapidJSON 的作者,開發 nativejson-benchmark 比較 41 個開源原生 JSON 庫的標準符合程度及性能。他在 1990 年學習 C 語言,1995 年開始使用 C++ 於各種項目。


推薦閱讀:

如何從CFG轉換到State Machine?
Json數據的簡化存儲
json是什麼?
XML/HTML/JSON——數據抓取過程中不得不知的幾個概念
大家一般用什麼工具測試HTTP,json介面?

TAG:JSON | CC | 教程 |