Potrzebuję pobrać zagnieżdżony obiekt wewnątrz łańcucha JSON i próbuję to zrobić za pomocą rapidjson. Wszystko, co udało mi się znaleźć, to sposób pobierania tablic i podstawowych typów, ale nie pod-obiektów. Stworzyłem następujący przykład zabawki, które daje błąd:Pobieranie obiektu zagnieżdżonego wewnątrz łańcucha JSON przy użyciu 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;
}
}
To jest wyjście, gdy wykonywane:
{ "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
Jak mogę odzyskać wewnętrzną obiektu, aby kontynuować moją analizowania? Dzięki.
Edit: Co potrzebne jest do uzyskania reprezentacji ciąg wewnętrznej obiektu, więc mogę wywołać inną funkcję, która zamierza je przetwarzać.
Edycja 2: kod, który pozwala odzyskać wewnętrzną obiektu jako ciąg znaków:
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;
}
}
Czy to oznacza, że RapidJson nie obsługuje obiektów hierarchicznych? więc analizuje tylko poziom główny?!?! –