如何将字符串对添加到rapidjson的文档中

时间:2016-01-03 06:21:24

标签: c++ json 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());

2 个答案:

答案 0 :(得分:7)

如果#define RAPIDJSON_HAS_STDSTRING 1(在包含rapidjson头文件之前,或在编译标志中定义),则std::string还有一些额外的API。

要制作std::string的“复制字符串”(分配重复的源字符串),可以使用带分配器的构造函数:

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 ......

答案 1 :(得分:0)

现在,我意识到我犯了两个错误:
1.我应该在doc.SetObject();创建后调用doc 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);
}

应该有更好的方法来做到这一点。