如何动态修改嵌套的RapidJSON对象?

时间:2019-02-26 04:51:56

标签: c++ rapidjson

我能找到的所有带有嵌套对象的Rapidjson示例基本上如下: 1)创建根对象 2)创建嵌套对象 3)构建/添加到嵌套对象(到目前为止,根对象未更改) 4)完成嵌套对象后,将其添加到根对象

我想在高层次上做什么: 1)创建根对象 2)创建嵌套对象并添加到根对象 3)构建/添加到嵌套对象(根对象本身也会被更新,无需采取进一步措施)

因此,如果在构建嵌套对象时抛出异常,则已经完成了将其添加到根对象的步骤,因此我至少已部分构建了嵌套对象,而不是完全丢失了。

这可能吗?任何帮助或见识将不胜感激!

1 个答案:

答案 0 :(得分:0)

我能够弄清楚这一点;但是,由于我还没有找到文档来支持它,因此我不确定我是否真正依赖于任何未定义或不受支持的行为。

//Prepare 'root' object as a document
rapidjson::Document document;
rapidjson::Document::AllocatorType& allocator = document.GetAllocator();
document.SetObject();
// 'document' currently serializes to {}

//Create an empty rapidjson 'object' as a Value, and add it to root
rapidjson::Value nestedObject(rapidjson::kObjectType);
document.AddMember("Parent", nestedObject, allocator);
// 'document' currently serializes to {"Parent":{}}

/*Retrieve the 'object' as a Value
This step is important! Trying to reuse the same 'nestedObject' Value from before
without "re-retrieving" it will result in assertion errors at runtime.
If you try to "re-retrieve" into the existing 'nestedValue' instance, the end
result below will be {"Parent":null}*/
rapidjson::Value &nestedObjectValue = document["Parent"];

//Modify the 'nestedObjectValue'
nestedObjectValue.AddMember("child", "child_value", allocator);
// 'document' currently serializes to {"Parent":{"child":"child_value"}}

最终,这是我想要的行为。我可以访问嵌套对象,可以随意对其进行修改,并且所做的更改将影响根文档。