如何将整个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();