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 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |