我想使用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& 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 writer(sb); doc.Accept(writer); log("json string: %s", sb.GetString());
Milo Yip.. 10
如果#define RAPIDJSON_HAS_STDSTRING 1
(在包含rapidjson头文件之前,或在编译标志中定义),还有一些额外的API std::string
.
要制作"复制字符串"(分配重复的源字符串)std::string
,可以使用带有allocator的构造函数:
for (auto& pair : map) { rapidjson::Value key(pair.first, allocator); rapidjson::Value value(pair.second, allocator); doc.AddMember(key, value, allocator); }
或者使它成为一个声明:
for (auto& pair : map) doc.AddMember( rapidjson::Value(pair.first, allocator).Move(), rapidjson::Value(pair.second, allocator).Move(), allocator);
如果你假设字符串的生命周期长于doc
,那么你可以使用"const-string",这样更简单,更有效:
for (auto& pair : map) doc.AddMember( rapidjson::StringRef(pair.first), rapidjson::StringRef(pair.second), allocator);
我认为RAPIDJSON_HAS_STDSTRING
应该更好地记录宏...
如果#define RAPIDJSON_HAS_STDSTRING 1
(在包含rapidjson头文件之前,或在编译标志中定义),还有一些额外的API std::string
.
要制作"复制字符串"(分配重复的源字符串)std::string
,可以使用带有allocator的构造函数:
for (auto& pair : map) { rapidjson::Value key(pair.first, allocator); rapidjson::Value value(pair.second, allocator); doc.AddMember(key, value, allocator); }
或者使它成为一个声明:
for (auto& pair : map) doc.AddMember( rapidjson::Value(pair.first, allocator).Move(), rapidjson::Value(pair.second, allocator).Move(), allocator);
如果你假设字符串的生命周期长于doc
,那么你可以使用"const-string",这样更简单,更有效:
for (auto& pair : map) doc.AddMember( rapidjson::StringRef(pair.first), rapidjson::StringRef(pair.second), allocator);
我认为RAPIDJSON_HAS_STDSTRING
应该更好地记录宏...