如何将RapidJSON文档序列化为字符串

How to serialize RapidJSON document to a string?

本文关键字:序列化 字符串 文档 RapidJSON      更新时间:2023-10-16

如何将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);
}