我想使用rapidjson创建一个json字符串.但我收到一个错误:无法将std :: string转换为rapidjson :: Type.
int x = 111; string className = "myclass"; Document doc; auto& allocator = doc.GetAllocator(); doc.AddMember("x",Value().SetInt(x),allocator); doc.AddMember("className",className,allocator); unordered_map<string,string>& map = sprite->toMap(); for (const auto& pair : map) { Value key(pair.first.c_str(),pair.first.size(),allocator); doc.AddMember(key,pair.second,allocator); } StringBuffer sb; Writer<StringBuffer> writer(sb); doc.Accept(writer); log("json string: %s",sb.GetString());
解决方法
如果#define RAPIDJSON_HAS_STDSTRING 1(在包含rapidjson头文件之前,或在编译标志中定义),则std :: string还有一些额外的API.
要创建std :: string的“copy-strings”(分配重复的源代码串),可以使用带有allocator的构造函数:
for (auto& pair : map) { rapidjson::Value key(pair.first,allocator); rapidjson::Value value(pair.second,value,allocator); }
或者使它成为一个声明:
for (auto& pair : map) doc.AddMember( rapidjson::Value(pair.first,allocator).Move(),rapidjson::Value(pair.second,allocator);
如果你假设字符串的生命周期比doc长,那么你可以使用“const-string”,这样更简单,更有效:
for (auto& pair : map) doc.AddMember( rapidjson::StringRef(pair.first),rapidjson::StringRef(pair.second),allocator);
我认为应该更好地记录宏RAPIDJSON_HAS_STDSTRING ……