文档章节

rapidjson走过的坑

JasonBound
 JasonBound
发布于 2016/09/13 10:27
字数 470
阅读 749
收藏 0

话说rapidjson使用起来极其不方便,没有想java那样方便快捷,于是自己动手封装,简单代码如下,重点将一些走过的坑

    rapidjson::Document m_document;
    m_document.SetObject();
    //写入字符串
    rapidjson::Value p_name(rapidjson::kStringType);
	p_name.SetString(key.c_str(), key.size(), m_document.GetAllocator());
	rapidjson::Value p_value(rapidjson::kStringType);
	p_value.SetString(value.c_str(), value.size(), m_document.GetAllocator());
    //
	m_document.AddMember(p_name, p_value, m_document.GetAllocator());
    //写入整型数
    rapidjson::Value p_name(rapidjson::kStringType);
	p_name.SetString(key.c_str(), key.size(), m_document.GetAllocator());
	m_document.AddMember<int>(p_name, value, m_document.GetAllocator());
    //写入Object//写入Array,此处所有Object和Array都是继承自Value都可以当作Value直接写入
    rapidjson::Value p_name(rapidjson::kStringType);
	p_name.SetString(key.c_str(), key.size(), m_document.GetAllocator());
	m_document.AddMember(p_name, Value/*value对象*/, m_document.GetAllocator());
    //读取代码,此处其他类型的数据获取类似,故省略
    string getString(const string& key)
    {
      auto iter = m_document.FindMember(key.c_str());
      return iter->value.GetString();
    }

然后我们来说说坑,整型数据都是数值拷贝所以没啥问题,但是字符串是符合数据类型就不同了,调用上会有区别,Value有提供两种重载函数来设置字符串

//此方法调试发现,传入第三个参数后最终会将字符串深拷贝处理,另外保存一份

Value.SetString(key.c_str(), key.size(), m_document.GetAllocator());

//此方法没有传入上面的第三个参数,调试发现只是简单的对指针做了赋值操作,并没有任何拷贝,这就会导致字符串如果是局部变量会导致内存释放问题,这种方式的存在意义我猜测是为了外部管理字符串提供支持

Value.SetString(key.c_str(), key.size());

//SetObject方法是Value提供的,目的是清理当前对象,并且设置为指定对象类型,有setArray等等

Object对象是通过调用addMember函数添加键值对,但是Array方法是通过pushback来添加元素,这里有区别

m_document.SetObject();

看到这里希望大家能绕坑,有疑问可以留言探讨

下面附上,封装代码https://git.oschina.net/zi6xuan/coco2dx_rapidjson

© 著作权归作者所有

共有 人打赏支持
JasonBound
粉丝 0
博文 4
码字总数 2405
作品 0
深圳
程序员
私信 提问
RapidJson递归去除空值元素Value

RapidJson是一款高效的C++处理JSON字符串的库。 教程:http://rapidjson.org/zh-cn/mddoctutorial8zh-cn.html#QueryObject 源码:https://github.com/Tencent/rapidjson 但不得不说教程写的不......

Cloudox_
2018/08/24
0
0
RapidJSON —— C++ 快速 JSON 解析器和生成器

Rapidjson 是一个 C++ 的快速 JSON 解析器和生成器,使用 SAX/DOM 风格的 API 设计。

oschina
2015/04/05
31
0
RapidJSON 1.0 正式版发布,C++的JSON开发包

RapidJSON 1.0 正式版发布,该版本在 1.0 Beta 的基础上实现了 100% 单元测试的覆盖率。 其他方面的改进包括: Fixed a bug in trimming long number sequence (4824f12) Fix double quote ...

oschina
2015/04/24
3.7K
6
RapidJSON —— C++ 快速 JSON 解析器和生成器

http://www.oschina.net/p/rapidjson

nevermore1981
2015/04/05
3
0
哪个哥们写的 rapidjson 真不赖啊

哪个哥们写的 rapidjson 真不赖啊 比jsoncpp快了 至少3倍 国产开源还是有牛逼的

Flynn
2012/10/31
3.3K
6

没有更多内容

加载失败,请刷新页面

加载更多

AWS的自动部署工具codedeploy 部署前的准备工作

开始部署codedeploy: 1.先预置IAM用户: 创建一个IAM用户或使用一个与AWS相关联的用户; 复制以下的策略附加到IAM用户,向IAM用户赋予对codedeploy(及codedeploy所依赖的AWS服务和操作)的...

守护-创造
26分钟前
0
0
这可能是最详细的一线大厂Mysql面试题详解了

1、MySQL的复制原理以及流程 基本原理流程,3个线程以及之间的关联; 主:binlog线程——记录下所有改变了数据库数据的语句,放进master上的binlog中; 从:io线程——在使用start slave 之后...

Java干货分享
36分钟前
1
0
人的精力是什么?如何强化精力

人的精力是什么? 人的精力是什么? 精力指精神和体力。精神包括一个人的精神状态,兴奋度,做事情的投入度,专注度,持续时间等。 人的精力来源 人的精力有4种来源,身体的、情感的、思想的和...

莫库什勒
55分钟前
2
0
JFinal开发的旅游线路营销Saas平台演示系统我部署了一个

今天部署了一个旅游线路营销管理系统的演示版: 演示地址:http://lvyou.jfinalxueyuan.com 演示账号:(暂时只给一个门店版的吧,批发商和总部的如果需要 演示看看 单独联系我微信:1876673...

山东-小木
今天
2
0
如何学习大数据技术

学习大数据技术,首先要明确大数据的概念。 大数据的概念作者认为有如下几点: 1.数据的来源多样性。例如关系数据库+文本+excel等 2.数据量大。TB级别的数据。 3.业务应用领域。实时性高与实...

董黎明
今天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部