使用jsonwriter复制成员

时间:2016-09-17 14:12:52

标签: rapidjson

如何使用rapidjson :: writer复制rapidjson :: Value?我在使用文档时找到了几种解决方案 - 但在使用编写器时却找不到。

例如为: How can I add members to a rapidjson document using integers as the key/name?

所以,我想要这样的事情发挥作用:

rapidjson::CrtAllocator _crtAllocator;
rapidjson::GenericStringBuffer<rapidjson::UTF8<>> _jsonBuffer;
rapidjson::PrettyWriter<rapidjson::StringBuffer> _jsonWriter;

void GeojsonWriter::addMember(std::string name, rapidjson::Value& value) {
    _jsonWriter.AddMember(name, value, _crtAllocator);
}

在我的情况下,一个示例用法是复制&#34;属性&#34; Geojson特征的对象到另一个特征(从不同的几何体创建,但应该被分配一个&#34;原始&#34;属性的副本)

更新

我已经按照以下答案实施了该方法。虽然我在下面访问itr-&gt; name.GetString()时遇到随机崩溃。崩溃导致std字符串...虽然有时相同的数据工作正常。这看起来很像内存分配问题 - 但我没有什么可以看的路径。

这里的std字符串崩溃(尽管可能不太相关):         static inline size_t length(const char_type * __s){return strlen(__ s);}

void copyGeojsonProperties(GeojsonWriter &writer, const rapidjson::Value* properties) {
    for (rapidjson::Value::ConstMemberIterator itr = properties->MemberBegin(); itr != properties->MemberEnd(); ++itr) {
        if (itr->name.IsString()) {
            const char* cstr = itr->name.GetString();
            if (!cstr || !itr->name.Empty())
                continue;
            std::string key = itr->name.GetString();
            const rapidjson::Value& val = itr->value;
            writer.addMember(key, val);
        }
    }
}

更新2

我找到了解决方法。我有多个输入json文档表单,我使用value.CopyFrom(...,document.GetAllocator())。问题是当读取json时文档被释放(我从不同的jsons复制对象,然后将它们写入另一个json)。现在我保留对指针的引用,以防止释放分配器。

虽然即使复制了值也需要保持分配器,但这并不明显。

1 个答案:

答案 0 :(得分:1)

如果作者已被称为html, body { height: 100%; } ,那么您只需要:

StartObject()