项目地址 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 便是此问题的答案。

其中 parse 和 generate 方法解析时序图:

最新文章

  1. Android标题栏最右边添加按钮
  2. 深入浅出JMS(二)--ActiveMQ简单介绍以及安装
  3. hashcode深入理解
  4. 关于CSS3线型渐变这些事儿
  5. ejabberd常见配置说明
  6. JavaWeb学习总结(八)—Cookie
  7. YUM安装提示PYCURL ERROR 6 - "Couldn&#39;t错误的解决办法
  8. 通过RDB还原用户误删除的邮件
  9. python测试框架--nose
  10. Fluent NHibernate
  11. CSS中background:url(图片) 不能显示的问题
  12. Java Socket应用---通信是这样练成的
  13. webpack踩坑之旅
  14. JavaScript进阶(七)JS截取字符串substr 和 substring方法的区别
  15. [Swift]LeetCode659. 分割数组为连续子序列 | Split Array into Consecutive Subsequences
  16. [SpringMVC]自定义注解实现控制器访问次数限制
  17. 请求转发和URL重定向的原理和区别
  18. Java和C++的数组比较
  19. 新安装 Ubuntu 系统设置root用户密码!谨此纪念自己踩过的坑!
  20. Android系统定制——Download Android System 及加载system镜像文件

热门文章

  1. Javascript学习笔记-基本概念-语句
  2. Aajx
  3. 7-49 求前n项的阶乘之和 (15 分)
  4. 内存:你跑慢点行不行?CPU:跑慢点你养我吗?内存:我不管!(内附超全思维导图)
  5. jquery 获取css3 transform 值
  6. Androidstudio实现一个简易的加法器——分享两种方法实现(日常作业练习)
  7. MFC Camera 摄像头预览 拍照
  8. C# .Net Core 3.1 中关于Process.Start 启动Url链接的问题
  9. chrome 和 chromeDriver
  10. 将python的字典格式数据写入excei表中