用C++寫一款簡單的JSON庫
- 2020 年 4 月 3 日
- 筆記
項目地址 jsoncpp ,此項目受到 leptjson 啟發,實現了最基本的功能,僅作學習使用。
- 提供簡單的 parse() 和 generate() 方法將 JSON 文本解析成對象,反之亦然
- 僅支援將基本類型為 Value 的 JSON 抽象語法樹與 JSON 文本相互轉換
- 使用標準 C/C++ 語言 (C++11)
- 不依賴第三方庫
啟動
啟動此項目需要安裝 gcc4.8 以上版本(支援c++11即可)
rm *.o rm start g++ -w -c -std=c++11 jsonValue.cpp g++ -w -c -std=c++11 jsonGenerator.cpp g++ -w -c -std=c++11 jsonParser.cpp g++ -w -c -std=c++11 test.cpp g++ -w jsonValue.o jsonGenerator.o jsonParser.o test.o -o start ./start
初步入門
如何解析一段json文本呢,我們可以先從更簡單的問題開始思考。
1、給定長文本 "[1,2,3]" ,問如何才能得到一個數組?
當我們想通過解析函數的連續調用去處理一段長文本時,解析函數需要分兩步實現:
- step1 解析文本並更新文本指針。
- step2 若解析成功則返回解析結果。
這裡只需要調用三次解析函數,最後遇到 ‘]’ 結束即可
class Parser{ char *txt; int parse_value() { /* 解析txt上下文 */ /* 返回一個數值 */ } } int main() { /* 建立parser */ while (*parser.txt != ']') { array[i] = parser.parse_value(); } }
2、給定長文本 "[1,2,[4,5]]" ,問如何才能得到一棵樹?
同理,這裡需要調用三次解析函數,最後遇到 ‘]’ 結束即可
typedef struct { int number; vector<Node* > array; } TreeNode class Parser{ char* txt; TreeNode* parse_value() { /* 解析txt上下文 */ /* 返回一個節點 */ } } int main() { /* 建立parser */ /* 建立樹根 */ while (*parser.txt != ']') { root.array[i] = parser.parse_value(); } }
完成了長文本的解析之後,再考慮解析函數本身的實現。 ‘1’ , ‘2’ 可以直接解析,而 "[4,5]" 可以看做一個長文本,做遞歸調用即可。
以上過程我均採用了面向對象的設計,每一個函數都是對對象的操作。當然,大家也可以採用面向過程的思路,但是務必將 txt 文本指針的地址傳入每個函數中,或者採用引用。
3、給定長文本 JSON ,問如何才能得到一棵樹?
本項目 jsoncpp 便是此問題的答案。