如何将RapidJSON文档序列化为字符串
How to serialize RapidJSON document to a string?
如何将RapidJSON文档序列化为字符串?
在所有示例中,序列化文本都通过FileStream
重定向到标准输出,但我需要将其重定向到字符串变量。
在项目的第一页中,代码已经展示了如何将文档序列化为字符串(将文档字符串化):
// 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());
tutorial.cpp也显示了同样的事情,除了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() );
。
示例代码:
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流概念类来包装现有的std::字符串,ref: 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);
}
相关文章:
- 带有Protobuf序列化的C++Hazelcast:字符串不是UTF-8格式的
- 如何在 c++ 非托管代码中反序列化 byte[] 的 json 字符串?
- POCO C++对象到 JSON 字符串序列化
- C++中的字符串序列化
- 使用 Json 转换器反序列化 WCF 服务中的C++字符串
- 在协议缓冲区 c++ 中反序列化字符串数组
- 如何将 boost::beast 中的序列化数据转换为字符串,以便我可以以 FIFO 方式处理它?
- c++ 序列化包含字符串和指向另一个对象的指针的对象
- 提升序列化提升进程间字符串
- 序列化的长字符串与快速JSON将被截断
- 使用 Cereal 反序列化 JSON 字符串
- 序列化结构以归档,并用字符串再次对其进行启用
- C++序列化只检索字符串的一半
- 对stl字符串和其他容器进行加密和序列化
- 如何在使用JSON boost序列化创建JSON字符串时获取名称-值对
- 如何在网络上序列化并发送JSOn字符串中的std::list
- 提升序列化字符串 *
- Boost -用TLV编码序列化字符串
- 如何正确地反序列化字符串指针
- boost序列化字符串流错误