话说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();
看到这里希望大家能绕坑,有疑问可以留言探讨