使用rapidjson在JSON字符串中检索嵌套对象

ppa*_*las 14 c++ json rapidjson

我需要在JSON字符串中检索嵌套对象,我正在尝试使用rapidjson.我发现的只是如何检索数组和基本类型,而不是子对象.我创建了以下玩具示例,它给出了一个错误:

rapidjson::Document document;
std::string test =  " { \"a\": { \"z\" : 21 } } ";
std::cout << test << std::endl;
if ( document.Parse<0>( test.c_str() ).HasParseError() ) {
    std::cout << "Parsing error" << std::endl;
} else {
    if ( document[ "a" ].IsObject() ) {
        std::cout << "OK" << std::endl;
        std::cout << document[ "a" ].GetString() << std::endl;
    }
}
Run Code Online (Sandbox Code Playgroud)

这是执行时的输出:

{ "a": { "z" : 21 } } 
OK
JSONTest: ../rapidjson/document.h:441: const typename Encoding::Ch* rapidjson::GenericValue<Encoding, Allocator>::GetString() const [with Encoding = rapidjson::UTF8<char>, Allocator = rapidjson::MemoryPoolAllocator<rapidjson::CrtAllocator>]: Assertion `IsString()' failed. Aborted
Run Code Online (Sandbox Code Playgroud)

如何检索内部对象以继续解析?谢谢.

编辑:我需要的是获取内部对象的字符串表示,以便我可以调用另一个将要解析它的函数.

编辑2:允许以字符串形式检索内部对象的代码:

rapidjson::Document document;
std::string test =  "{\"a\":{\"z\":21}} ";
if ( document.Parse<0>( test.c_str() ).HasParseError() ) {
    std::cout << "Error parsing" << std::endl;
} else {
    if ( document[ "a" ].IsObject() ) {
        rapidjson::StringBuffer sb;
        rapidjson::Writer<rapidjson::StringBuffer> writer( sb );
        document[ "a" ].Accept( writer );
        std::cout << sb.GetString() << std::endl;
    }
}
Run Code Online (Sandbox Code Playgroud)

Ves*_*per 7

您需要手动迭代对象的成员,因为GetString()仅适用于字符串成员,而document ["a"]是Object.您需要使用MemberIterator变量遍历该对象的成员.我在C*中没有练习超过15年,所以我只能大致了解它应该如何工作:

for (MemberIterator m = document["a"].MemberBegin(); m != document["a"].MemberEnd(); ++m) {
    std::cout << m.name << " " << (m.IsNumber()?m.GetNumber():m.GetString()) << endl;
}
Run Code Online (Sandbox Code Playgroud)

此外,您可能希望查看Accept()方法,它似乎返回您提供的对象的JSON字符串.