【发布时间】:2016-01-22 13:16:47
【问题描述】:
如何将 RapidJSON 文档序列化为字符串?
在所有示例中,序列化文本通过FileStream 重定向到标准输出,但我需要将其重定向到字符串变量。
【问题讨论】:
标签: c++ string document rapidjson
如何将 RapidJSON 文档序列化为字符串?
在所有示例中,序列化文本通过FileStream 重定向到标准输出,但我需要将其重定向到字符串变量。
【问题讨论】:
标签: c++ string document rapidjson
像这样:
const char *GetJsonText()
{
rapidjson::StringBuffer buffer;
buffer.Clear();
rapidjson::Writer<rapidjson::StringBuffer> writer(buffer);
doc.Accept(writer);
return strdup( buffer.GetString() );
}
那么你必须在返回时调用 free(),或者这样做:
return string( buffer.GetString() );
改为。
【讨论】:
buffer.GetString()的对象类型是什么
在first page of the project中,代码已经展示了如何将文档序列化为字符串(stringify a document):
// 3. Stringify the DOM
StringBuffer buffer;
Writer<StringBuffer> writer(buffer);
d.Accept(writer);
// Output {"project":"rapidjson","stars":11}
std::cout << buffer.GetString() << std::endl;
buffer.GetString() 这里返回一个const char* 类型的字符串。它还有一个buffer.GetSize() 用于返回输出字符串的大小。因此,如果您将其转换为std::string,最好的方法是:
std::string s(buffer.GetString(), buffer.GetSize());
除了 RapidJSON 的其他常见用法之外,tutorial.cpp 也显示相同的内容。
【讨论】:
buffer 的析构函数会释放buffer.GetString() 吗?如果是,那么有没有办法移动buffer的内容而不是复制它?
示例代码:
Document document;
const char *json = " { \"x\" : \"0.01\", \"y\" :\"0.02\" , \"z\" : \"0.03\"} ";
document.Parse<0>(json);
//convert document to string
StringBuffer strbuf;
strbuf.Clear();
Writer<StringBuffer> writer(strbuf);
document.Accept(writer);
std::string ownShipRadarString = strbuf.GetString();
std::cout << "**********************************************" << ownShipRadarString << std::endl;
【讨论】:
为避免复制字符串内容,您可以创建一个 rapidjson Stream-concept 类来包装现有的 std::string,参考:https://github.com/Tencent/rapidjson/issues/846#issuecomment-298088278
事实上,并非所有实现的方法都是必需的。应该这样做:
void writeDocumentToString(const rapidjson::Document& document,
std::string& output)
{
class StringHolder
{
public:
typedef char Ch;
StringHolder(std::string& s) : s_(s) { s_.reserve(4096); }
void Put(char c) { s_.push_back(c); }
void Flush() { return; }
private:
std::string& s_;
};
StringHolder os(output);
rapidjson::Writer<StringHolder> writer(os);
document.Accept(writer);
}
【讨论】: