如何将字符串对添加到 rapidjson 文档中
How can I add string pairs to a document of rapidjson
我想使用 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());
现在,我意识到我犯了两个错误:
1. 我应该在创建 doc
之后调用 doc.SetObject();
。
2. How to create string in rapidjson.
Document doc;
doc.SetObject();
auto& allocator = doc.GetAllocator();
rapidjson::Value s;
s = StringRef(className.c_str());
doc.AddMember("className", s, allocator);
auto& map = sprite->toJson();
for (auto& pair : map) {
rapidjson::Value key(pair.first.c_str(), pair.first.size(), allocator);
rapidjson::Value value(pair.second.c_str(), pair.second.size(), allocator);
doc.AddMember(key, value, allocator);
}
应该有更好的方法。
如果#define RAPIDJSON_HAS_STDSTRING 1
(在包含rapidjson头文件之前,或在编译标志中定义),std::string
有一些额外的API。
要生成 std::string
的 "copy-strings"(已分配源字符串的副本),您可以使用带分配器的构造函数:
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
...
我想使用 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());
现在,我意识到我犯了两个错误:
1. 我应该在创建 doc
之后调用 doc.SetObject();
。
2. How to create string in rapidjson.
Document doc;
doc.SetObject();
auto& allocator = doc.GetAllocator();
rapidjson::Value s;
s = StringRef(className.c_str());
doc.AddMember("className", s, allocator);
auto& map = sprite->toJson();
for (auto& pair : map) {
rapidjson::Value key(pair.first.c_str(), pair.first.size(), allocator);
rapidjson::Value value(pair.second.c_str(), pair.second.size(), allocator);
doc.AddMember(key, value, allocator);
}
应该有更好的方法。
如果#define RAPIDJSON_HAS_STDSTRING 1
(在包含rapidjson头文件之前,或在编译标志中定义),std::string
有一些额外的API。
要生成 std::string
的 "copy-strings"(已分配源字符串的副本),您可以使用带分配器的构造函数:
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
...