rapidjson走过的坑

前端之家收集整理的这篇文章主要介绍了rapidjson走过的坑前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

话说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(),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(),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(),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

猜你在找的Json相关文章