從零開始的JSON庫

從零開始的JSON庫

項目地址 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 便是此問題的答案。