dWitty
dWitty

Reputation: 524

Convert from Rapidjson Value to Rapidjson Document

As per the tutorial:

Each JSON value is stored in a type called Value. A Document, representing the DOM, contains the root Value of the DOM tree.

If so, it should be possible to make a sub-document from a document.

If my JSON is:

{
    "mydict": {
        "inner dict": {
            "val": 1,
            "val2": 2
        }
    }
}

I'd like to be able to create a Document from the inner dictionary.

(And then follow the instructions in the FAQ for How to insert a document node into another document?)

Upvotes: 3

Views: 7192

Answers (1)

Josh Olson
Josh Olson

Reputation: 407

Given the original document contains:

{
    "mydict": {
        "inner dict": {
            "val": 1,
            "val2": 2
        }
    }
}

You can copy the sub-document:

const char json[] = "{\"mydict\": {\"inner dict\": {\"val\": 1, \"val2\": 2}}}";
Document doc, sub; // Null
doc.Parse(json);
sub.CopyFrom(doc["mydict"], doc.GetAllocator());

You can also swap the sub-document with another:

const char json[] = "{\"mydict\": {\"inner dict\": {\"val\": 1, \"val2\": 2}}}";
Document doc, sub; // Null
doc.Parse(json);
sub.Swap(doc["mydict"]);

With some validation:

const char json[] = "{\"mydict\": {\"inner dict\": {\"val\": 1, \"val2\": 2}}}";
Document doc, sub; // Null
doc.Parse(json);
if (doc.IsObject()) {
    auto it = doc.FindMember("mydict");
    if (it != doc.MemberEnd() && it->value.IsObject()) {
        sub.Swap(it->value);
    }
}

Each will result in sub containing:

{
    "inner dict": {
        "val": 1,
        "val2": 2
    }
}

With the CopyFrom() approach, doc will contain:

{
    "mydict": {
        "inner dict": {
            "val": 1,
            "val2": 2
        }
    }
}

With Swap():

{
    "mydict": null
}

Upvotes: 3

Related Questions