RapidJSON / C ++:创建对象/数组的更好方法?

时间:2018-07-19 22:04:06

标签: c++ json loops iterator rapidjson

我刚刚开始使用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());
        }

它确实有效,但是对我来说这显得笨拙。我无法弄清楚是否有更好/更短/更好的方法来执行此操作...我尝试了尝试在原地创建对象的几种方法,但是它们要么无法编译,要么在运行时崩溃。

有任何提示吗?

1 个答案:

答案 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)。