项目地址 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 方法解析时序图:

从零开始的JSON库的更多相关文章

  1. 快速上手Unity原生Json库

    现在新版的Unity(印象中是从5.3开始)已经提供了原生的Json库,以前一直使用LitJson,研究了一下Unity用的JsonUtility工具类的使用,发现使用还挺方便的,所以打算把项目中的J ...

  2. Java 下的 JSON库性能比较:JSON.simple

    JSON已经成为当前服务器与WEB应用之间数据传输的公认标准,不过正如许多我们所习以为常的事情一样,你会觉得这是理所当然的便不再深入思考了.我们很少会去想用到的这些JSON库到底有什么不同,但事实上它 ...

  3. JSON库之性能比较:JSON.simple VS GSON VS Jackson VS JSONP

    从http://www.open-open.com/lib/view/open1434377191317.html 转载 Java中哪个JSON库的解析速度是最快的? JSON已经成为当前服务器与WE ...

  4. C++ json库jsoncpp 吐槽

    Explain 最近在做游戏接入SDK时用到C++的json库jsoncpp,jsoncpp 是一款优秀的json库,但恶心的一点是它采用Assert作为错误处理方法,而assert在linux下通过 ...

  5. 一个现代化的JSON库Moshi针对Android和Java

    Moshi 是一个现代化的JSON库针对Android和Java.它可以很容易地解析JSON成Java对象: String json = ...; Moshi moshi = new Moshi.Bu ...

  6. [C#技术] .NET平台开源JSON库LitJSON的使用方法

    一个简单示例: String str = "{’name’:’cyf’,’id’:10,’items’:[{’itemid’:1001,’itemname’:’hello’},{’itemi ...

  7. 高性能JSON库---FastJson(阿里巴巴)

    1.FastJSON简单介绍 Fastjson是一个Java语言编写的高性能功能完好的JSON库. 它採用一种"假定有序高速匹配"的算法,把JSON Parse的性能提升到极致,是 ...

  8. Java几种常用JSON库性能比较

    本篇通过JMH来测试一下Java中几种常见的JSON解析库的性能. 每次都在网上看到别人说什么某某库性能是如何如何的好,碾压其他的库.但是百闻不如一见,只有自己亲手测试过的才是最值得相信的. JSON ...

  9. JSON库的使用研究(三)

    怎么选择JSON库? 从整体测试结果来看,总结如下: 用于序列化.反序列的功能,数量量小,吞吐量不大于10000每秒的,选择gson: 用于解析JSON的,还是用Fastjson吧,虽然听说坑很多. ...

随机推荐

  1. 没有图片的freemarker下载,备份

    没有图片的freemarker下载,备份 //以下代码也可以使用/* public String exportApproveCase(@PathVariable("proId") ...

  2. jstack的使用

    一.概述 有些时候我们需要查看下jvm中的线程执行情况,比如,发现服务器的CPU的负载突然增高了.出现了死锁.死循环等,我们该如何分析呢? 由于程序是正常运行的,没有任何的输出,从日志方面也看不出什么 ...

  3. centos 7上openJdk 安装

    为什么不安装Oracle版本 oracle jdk 现在下载太恶心了会被登陆拦截.于是就安装openjdk. 步骤 下载 yum -y install java-1.8.0-openjdk java- ...

  4. python+opencv->边缘提取与各函数参数解析

    前情提要:作为刚入门机器视觉的小伙伴,第一节课学到机器视觉语法时觉得很难理解, 很多人家的经验,我发现都千篇一律,功能函数没解析,参数不讲解,就一个代码,所以在此将搜集的解析和案例拿出来汇总!!! 一 ...

  5. 使用pyecharts绘制词云图-淘宝商品评论展示

    一.什么是词云图? 词云图是一种用来展现高频关键词的可视化表达,通过文字.色彩.图形的搭配,产生有冲击力地视觉效果,而且能够传达有价值的信息. 制作词云图的网站有很多,简单方便,适合小批量操作. BI ...

  6. aireplay包注入攻击

    reaver爆破WPS PIN码: airodump-ng wlan0 reaver -i wlan0 -b D0:76:E7:51:2A:78 -vv   macchanger更改MAC地址: ma ...

  7. 洛谷P1000超级马里奥的神奇解法

    话说上过洛谷的都知道,有一道经典例题P1000超级马里奥,这一题,可以说是非常简单非常经典,但是就算如此,还是可以人才辈出,我是个比较循规蹈矩的人(雾),所以我的代码就比较平常,也就是直接输出了所要求 ...

  8. jadx初识

    一.jadx介绍 一款相对流行的反编译工具 下载:https://github.com/skylot/jadx/releases/tag/v1.0.0 解压后得到这么几个文件: 启动:(以下来两个文件 ...

  9. 从 Spring 的环境到 Spring Cloud 的配置

    需求 不知不觉,web 开发已经进入 “微服务”.”分布式” 的时代,致力于提供通用 Java 开发解决方案的 Spring 自然不甘人后,提出了 Spring Cloud 来扩大 Spring 在微 ...

  10. 测试必知必会系列- Linux常用命令 - ls

    21篇测试必备的Linux常用命令,每天敲一篇,每次敲三遍,每月一循环,全都可记住!! https://www.cnblogs.com/poloyy/category/1672457.html 列出当 ...