gpt4 book ai didi

c++ - 有没有办法有效地将 rapidjson 与 std::string 一起使用?

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:18:36 28 4
gpt4 key购买 nike

我正在尝试使用 rapidjson。

我想生成字符串并将其添加到一些 rapidjson::Value这是对象。

我在使用 qjson 时使用的是 std::string,但在 rapidjson 的情况下似乎不合适。我不想生成字符串然后复制它,字符串对象生命周期在对象 ( rapidjson::Value ) 生命周期之前结束(因此 generated_string.c_str() 不是这种情况)。json中可能有\0,所以,char*使用以 null 结尾的字符串也不是解决方案。

那么,我必须编写自己的字符串类型吗?或者使用类似

auto create_string_object() -> rapidjson::GenericStringRef<char>
{
size_t len;
char* result;
// generate char* result with length len
const char* return_value = result;
return rapidjson::StringRef(return_value,len);
}
auto create_object_object(rapidjson::Document::AllocatorType &allocator) -> rapidjson::Value
{
// ...
rapidjson::Value result(rapidjson::kObjectType);
rapidjson::Value tmp; // tmp = create_string_object() will not compile
tmp = create_string_object();
result.AddMember("key", tmp, allocator);
// ...
}

或者还有其他一些处理字符串的方法?这对我来说似乎很难。我们不能将字符串移动到 rapidjson::Value因为里面的结构不同Value , 我们不能在 Value 中设置指针至 c_str()因为字符串将在 Value 之前被销毁.即使有 GenericStringRef<char>我必须重写几乎所有使用字符串的工作。

顺便说一句,为什么RAPIDJSON_HAS_STDSTRING默认是0?工作有问题?我看到我可以将字符串复制到 rapidjson::Value如果我知道字符串生命周期将在值生命周期之前结束,则复制指针。

UPD:现在我看到 rapidjson 只释放被复制的字符串:

  //! Destructor.
/*! Need to destruct elements of array, members of object, or copy-string.
*/
~GenericValue() {
if (Allocator::kNeedFree) { // Shortcut by Allocator's trait
switch(flags_) {
case kArrayFlag:
for (GenericValue* v = data_.a.elements; v != data_.a.elements + data_.a.size; ++v)
v->~GenericValue();
Allocator::Free(data_.a.elements);
break;

case kObjectFlag:
for (MemberIterator m = MemberBegin(); m != MemberEnd(); ++m)
m->~Member();
Allocator::Free(data_.o.members);
break;

case kCopyStringFlag:
Allocator::Free(const_cast<Ch*>(data_.s.str));
break;

default:
break; // Do nothing for other types.
}
}
}

因此,正如在回答中所说,使用 GenericStringRef在我的代码中这样的方式是一个坏主意,因为在这种情况下我必须自己管理内存。

最佳答案

我不完全理解这个问题。但我想在这里澄清一些事情。

  1. GenericStringRef用于防止字符串复制。仅当已知字符串的生命周期足够时才应使用它。对于动态创建的字符串,通常不应该使用 GenericStringRef .
  2. 设置RAPIDJSON_HAS_STDSTRING=1很好。默认情况下不打开,因为它的支持是在早期发布后添加的。而且我不希望 RapidJSON header 包含 <string>如果用户不需要。由于您使用 std::string , 你可以打开它。它应该让你更容易处理std::string .

关于c++ - 有没有办法有效地将 rapidjson 与 std::string 一起使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30157406/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com