Reference:  https://blog.csdn.net/elloop/article/details/49908689

rapidjson简介

rapidjson是腾讯的开源json解析框架,用c++实现。由于全部代码仅用header file实现,所以很容易集成到项目中。

rapidjson的性能是很出色的,其作者Milo Yipz做了28个C/C++ JSON库的评测,这个链接里有测试的结果截图。

rapidjson的另一个特点是对json的标准符合程度是100%的(在开启了full precision选项的情况下)。

这里是官方教程:rapidjson官方教程

这里是原作者对rapidjson代码的剖析:rapidjson代码剖析

我之前的项目使用的是jsoncpp,最近在把解析json的代码交叉编译到iOS设备的时候,偶尔会出现crash的情况。虽然经过检查是代码写的有问题,不是jsoncpp的问题,在解决问题过程中尝试了rapidjson这个库,并顺便对比了一下jsoncpp和rapidjson对我项目中json文件的解析速度。

Dom解析示例

下面是我写的一个小例子,从test.json文件中读取内容并解析。其他代码示例也可以查看我的github仓库中关于rapidjson的测试代码:rapid_json_test.cpp.

// test.json
{
"dictVersion": 1,
"content":
[
{"key": "word1", "value": "单词1"} ,
{"key": "word2", "value": "单词2"} ,
{"key": "word3", "value": "单词3"} ,
{"key": "word4", "value": "单词4"} ,
{"key": "word5", "value": "单词5"}
]
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
// test.cpp
#include "rapidjson/document.h"
#include "rapidjson/stringbuffer.h"
#include "rapidjson/writer.h"
#include <fstream>
#include <string>
#include <cassert>
#include <iostream>
#define psln(x) std::cout << #x " = " << (x) << std::endl void testSimpleDoc() {
using std::string;
using std::ifstream; // read json content into string.
string stringFromStream;
ifstream in;
in.open("test.json", ifstream::in);
if (!in.is_open())
return;
string line;
while (getline(in, line)) {
stringFromStream.append(line + "\n");
}
in.close(); // ---------------------------- read json --------------------
// parse json from string.
using rapidjson::Document;
Document doc;
doc.Parse<0>(stringFromStream.c_str());
if (doc.HasParseError()) {
rapidjson::ParseErrorCode code = doc.GetParseError();
psln(code);
return;
} // use values in parse result.
using rapidjson::Value;
Value & v = doc["dictVersion"];
if (v.IsInt()) {
psln(v.GetInt());
} Value & contents = doc["content"];
if (contents.IsArray()) {
for (size_t i = 0; i < contents.Size(); ++i) {
Value & v = contents[i];
assert(v.IsObject());
if (v.HasMember("key") && v["key"].IsString()) {
psln(v["key"].GetString());
}
if (v.HasMember("value") && v["value"].IsString()) {
psln(v["value"].GetString());
}
}
}
// ---------------------------- write json --------------------
pcln("add a value into array"); Value item(Type::kObjectType);
item.AddMember("key", "word5", doc.GetAllocator());
item.AddMember("value", "单词5", doc.GetAllocator());
contents.PushBack(item, doc.GetAllocator()); // convert dom to string.
StringBuffer buffer; // in rapidjson/stringbuffer.h
Writer<StringBuffer> writer(buffer); // in rapidjson/writer.h
doc.Accept(writer); psln(buffer.GetString());
}

最新文章

  1. js - 奇怪的回调探索
  2. ASP.NET文件上传大小的限制解决方案
  3. 安卓处理原始XML文件
  4. [CareerCup] 13.3 Virtual Functions 虚函数
  5. python学习笔记三 函数(基础篇)
  6. windows下Gulp入门详细教程 &amp;&amp;gulp安装失败的原因(红色)
  7. Android基础总结(6)——内容提供器
  8. Java IO学习总结
  9. Python之路,Day16 - Django 进阶
  10. (转)Apple Push Notification Services in iOS 6 Tutorial: Part 2/2
  11. JQuery 的基本命令
  12. Unity StrangeIoc框架 (二)
  13. Swift - 数组排序方法(附样例)
  14. 重磅消息:微信小程序支持长按二维码进入
  15. Spark技术内幕:Shuffle的性能调优
  16. Linux管理日记(三)
  17. jQuery和Zepto冲突问题【解决】
  18. Bash笔记
  19. 2017 清北济南考前刷题Day 7 afternoon
  20. UOJ#55 [WC2014]紫荆花之恋

热门文章

  1. 【Hibernate】hibernate框架的搭建
  2. /usr 的由来及/usr目录结构 [转]
  3. C++中的成员对象
  4. Android Studio 代码导航快捷键总结
  5. PHP的生成器、yield和协程
  6. unity, ios skin crash
  7. WPF 4 Ribbon 开发 之 快捷工具栏(Quick Access Toolbar)
  8. phantomjs 的安装部署
  9. HTML常用标签(整理)
  10. Android 7.0 介绍和适配问题