我正在尝试使用 rapidjson。
我想生成字符串并将其添加到rapidjson::Value
对象中。
我在使用 qjson 时使用了 std::string,但如果使用 rapidjson,它似乎不合适。我不想生成字符串然后复制它,字符串对象的生命周期在 object ( 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
以我的代码中的方式使用是一个坏主意,因为在这种情况下,我必须自己管理内存。