我刚刚开始使用RapidJSON;目前,我有一个字符串的STL映射;我想将其表示为JSON。
到目前为止,我已经做到了:
using JSONDocument = rapidjson::GenericDocument<rapidjson::UTF8<>>;
using JSONValue = rapidjson::GenericValue<rapidjson::UTF8<>>;
JSONDocument jsonRoot(rapidjson::kArrayType);
for (auto const &kv : localeMap) {
std::string key = kv.first;
std::replace(key.begin(), key.end(), ' ','_');
boost::to_lower(key);
JSONValue k(rapidjson::kObjectType);
JSONValue v(rapidjson::kObjectType);
k.SetString(key,jsonRoot.GetAllocator());
v.SetString(kv.second,jsonRoot.GetAllocator());
JSONValue kv_(rapidjson::kObjectType);
kv_.AddMember(k,v,jsonRoot.GetAllocator());
jsonRoot.PushBack(kv_, jsonRoot.GetAllocator());
}
它确实有效,但是对我来说这显得笨拙。我无法弄清楚是否有更好/更短/更好的方法来执行此操作...我尝试了尝试在原地创建对象的几种方法,但是它们要么无法编译,要么在运行时崩溃。
有任何提示吗?
答案 0 :(得分:1)
JSONValue k(rapidjson::kObjectType);
JSONValue v(rapidjson::kObjectType);
k.SetString(key,jsonRoot.GetAllocator());
v.SetString(kv.second,jsonRoot.GetAllocator());
可以简化为:
JSONValue k(key, jsonRoot.GetAllocator());
JSONValue v(kv.second, jsonRoot.GetAllocator());
为了提高性能,您可以在多个PushBack()
之前保留数组类型的大小:
jsonRoot.Reserve(localMap.size(), jsonRoot.GetAllocator());
如果您只需要JSON,则可以改用SAX API(rapidjson::Writer
)。