從零開始的 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 個單元附帶練習和解答。
- 啟程(2016/9/15 完成):編譯環境、JSON 簡介、測試驅動開發、解析器主要函數及各數據結構。練習 JSON 布爾類型的解析。啟程解答編(2016/9/17 完成)。
- 解析數字(2016/9/18 完成):JSON number 的語法。練習 JSON number 類型的校驗。解析數字解答篇(2016/9/20 完成)
- 解析字元串(2016/9/22 完成):使用 union 存儲 variant、自動擴展的堆棧、JSON string 的語法、valgrind。練習最基本的 JSON string 類型的解析、內存釋放。解析字元串解答篇 (2016/9/27 完成)
- Unicode(2016/10/2 完成):Unicode 和 UTF-8 的基本知識、JSON string 的 unicode 處理。練習完成 JSON string 類型的解析。Unicode 解答篇(2016/10/6 完成)
- 解析數組(2016/10/8 完成):JSON array 的語法。練習完成 JSON array 類型的解析、相關內存釋放。解析數組解答篇(2016/10/13 完成)
- 解析對象(2016/10/29 完成):JSON object 的語法、重構 string 解析函數。練習完成 JSON object 的解析、相關內存釋放。解析對象解答篇(2016/11/15 完成)
- 生成器:JSON 生成過程、注意事項。練習完成 JSON 生成器。
- 訪問:JSON array/object 的訪問及修改。練習完成相關功能。
- 終點及新開始:加入 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介面?