获取整个rapidjson :: Document的字符串

时间:2017-03-21 19:32:24

标签: c++ rapidjson

如何将整个rapidjson :: Document作为字符串?

我有以下代码:

rapidjson::Document jsonDoc;
rapidjson::MemoryPoolAllocator<> & allocator = jsonDoc.GetAllocator();
jsonDoc.SetObject();
jsonDoc.AddMember("ACTION", "poop", allocator);
jsonDoc.AddMember("TRANSACTIONID", 2, allocator);
std::string json = jsonDoc.GetString(); // Assert fails here, not a string

并且它失败了一个断言,因为它不是一个字符串。

我见过一些人们使用SAX而不是DOM来获取字符串的例子:

rapidjson::StringBuffer buffer;
buffer.Clear();
rapidjson::Writer<rapidjson::StringBuffer> writer(buffer);

writer.StartObject();

writer.String("ACTION");
writer.String("poop");

writer.String("Trans");
writer.Int(19);

writer.EndObject();

std::string json = buffer.GetString();

但我宁愿以前一种方式构建我的DOM,而不是使用SAX。

编辑:

再阅读文档,看来他们希望我们使用SAX将DOM转换为字符串?从以下内容:

“DOM as SAX Event Publisher

在RapidJSON中,使用Writer对DOM进行字符串化可能看起来有些问题。     // ...     作家作家(缓冲区);     d.Accept(作家);

实际上,Value :: Accept()负责将有关值的SAX事件发布到处理程序。通过这种设计,Value和Writer是分离的。值可以生成SAX事件,Writer可以处理这些事件。

用户可以创建自定义处理程序,将DOM转换为其他格式。例如,一个将DOM转换为XML的处理程序。

有关SAX事件和处理程序的更多信息,请参阅SAX。 “

所以,我想出了以下代码。有人可以验证这是这样做的吗?

std::string myString1("poop");
const std::string myString2("poopy");

rapidjson::Document jsonDoc;
rapidjson::MemoryPoolAllocator<> & allocator = jsonDoc.GetAllocator();

jsonDoc.SetObject();

// We have to use StringRef because they can't handle an std::string, WTF?
jsonDoc.AddMember("ACTION", rapidjson::StringRef(myString1.c_str()), allocator);
jsonDoc.AddMember("CONSTACTION", rapidjson::StringRef(myString2.c_str()), allocator);
jsonDoc.AddMember("TRANSACTIONID", 2, allocator);

rapidjson::StringBuffer buffer;
buffer.Clear();
rapidjson::Writer<rapidjson::StringBuffer> writer(buffer);
jsonDoc.Accept(writer);
std::string json = buffer.GetString();

0 个答案:

没有答案