【问题标题】:RapidJSON/C++: Better ways to create objects/arrays?RapidJSON/C++:创建对象/数组的更好方法?
【发布时间】:2018-07-19 22:04:06
【问题描述】:

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

它有效,但对我来说这看起来非常笨拙。我不知道是否有更好/更短/更高性能的方法来执行此操作...我尝试了几种尝试在适当位置创建对象的变体,但它们要么不编译,要么在运行时崩溃。

有什么提示吗?

【问题讨论】:

  • 你被 RapidJSON 锁定了吗? nlohmann::json 使它成为 really easy
  • 你试过ThorsSerializer你不需要写任何代码来序列化一个std::map。

标签: c++ json loops iterator rapidjson


【解决方案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)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-12-19
    • 2015-09-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多