gpt4 book ai didi

c++ - 使用 rapidjson 检索 JSON 字符串中的嵌套对象

转载 作者:IT老高 更新时间:2023-10-28 22:41:16 29 4
gpt4 key购买 nike

我需要在 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;
}
}

这是执行时的输出:

{ "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

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

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

编辑 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;
}
}

最佳答案

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

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

另外,你可能想看看 Accept() 方法,它似乎返回你给它的对象的 JSON 字符串。

关于c++ - 使用 rapidjson 检索 JSON 字符串中的嵌套对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12742840/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com