使用 jsonwriter 复制成员

Copy member using jsonwriter

如何使用rapidjson::writer复制rapidjson::Value?我在使用 Document 时找到了几个解决方案 - 但在使用 writer 时却找不到。

例如:

所以,我想要这样的东西工作:

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);
}

在我的例子中,一个示例用法是将 Geojson 特征的 "properties" 对象复制到另一个特征(它是从不同的几何体创建的,但应该分配一个"original" 个属性)

更新

我已经实现了下面答案中的方法。虽然我在访问下面的 itr->name.GetString() 时遇到随机崩溃。崩溃导致标准字符串......虽然有时相同的数据工作正常。这看起来很像一个内存分配问题——但我没有任何线索可以查看。

这里的 std 字符串崩溃(虽然可能不太相关): 静态内联 size_t 长度(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 时文档被释放(我从不同的 json 复制对象,然后将它们写入另一个 json)。现在我保留对指针的引用,以防止分配器被释放。

即使在复制值时也需要保留分配器,但这并不明显。

如果作者已经被调用StartObject(),那么您只需要:

void GeojsonWriter::addMember(const std::string& name, const rapidjson::Value& value) {
    _jsonWriter.Key(name.c_str(), name.size());
    value.Accept(_jsonWriter);
}