Mam zagnieżdżony obiekt JSON. Próbuję zbudować go w funkcji i dodać obiekt wewnętrzny do oryginału, ale nie mogę wyodrębnić wyniku.Poco C++ budowanie zagnieżdżonych obiektów JSON
void build_object (Poco::JSON::Object * const result)
{
/* Construct some int/bool/string fields here */
Poco::JSON::Object inner;
inner.set("some_number", 5);
inner.set("some_string", "xyz");
/* This is where it breaks down */
std::string key = "new_object";
result->set("new_object", inner);
/* Then some debugging and testing */
// The new object is printed inside the first -> seems like it's working
result->stringify(std::cout);
printf("result has(key): %i\n", result->has(key)); // true
printf("isObject: %i\n", result->isObject(key)); // false - huh?
printf("isNull: %i\n", result->isNull(key)); // false
printf("isArray: %i\n", result->isArray(key)); // false
Poco::JSON::Object::Ptr ptr = result->getObject(key);
// unsurpisingly fails since the above indicates it's not an object
printf("ptr isNull: %i\n", ptr.isNull()); // true
// ptr->has("some_number"); // throws NullPointerException
// if it's not an object/null/array, it must be a value
Poco::Dynamic::Var v = result->get(key);
// at least one of these things should be true, otherwise what is it?
printf("var isString: %i\n", v.isString()); // false
printf("var isStuct: %i\n", v.isStruct()); // false
printf("var isEmpty: %i\n", v.isEmpty()); // false
printf("var isArray: %i\n", v.isArray()); // false
printf("var isSigned: %i\n", v.isSigned()); // false
printf("var isNumeric: %i\n", v.isNumeric());// false
}
Tak, mam wewnętrzną obiekt, który jest prawidłowo wprowadzone do wyniku, to jest drukowane przez stringify ze wszystkimi poprawnymi wartościami i result-> ma() zakończy się pomyślnie. Ale, zgodnie z wynikiem, nie jest to obiekt, tablica ani wartość null, więc powinieneś być w stanie go uzyskać z var. Ale po pobraniu z var, nie jest to ciąg, struktura, tablica ani liczba, a także nie jest pusty. Wewnętrzny obiekt wydaje się istnieć i nie istnieje w tym samym czasie.
Jak umieścić ten obiekt w moim wyniku? I jak mam to wydobyć?
Dzięki
uwaga: Widziałem ten wątek Correct usage of Poco C++ JSON for parsing data, ale buduje obiekt JSON z łańcucha, a następnie analizowania go. Sądzę, że mógłbym wszystko zbudować jako strunę i przejść na Poco Object na ostatnim etapie, ale wciąż jestem ciekawy, dlaczego to się dzieje. Ponadto użycie result-> set() i result-> get() jest czystszym, mniej hack-y rozwiązaniem niż przejściem przez string.
Referencje: Poco JSON Doc, Poco Dynamic Var Doc
Jaki jest rodzaj powrotu do '' result-> has' result-> isObject' itp? Jeśli jest to 'bool', to niezdefiniowanym zachowaniem jest użycie' bool' w instrukcji 'printf()', ponieważ nie ma oficjalnego specyfikatora formatu dla 'bool'. – PaulMcKenzie
Typ powrotu to bool. Zamieniam true i false na 1 i 0 w moich komentarzach powyżej. To nie jest problem z drukowaniem - mogę rzucić je wszystkie do int i uzyskać ten sam wynik, także jako bardziej przekonujący test obiektów zerowych, próbując użyć ptr z 'ptr = result-> getObject (key)' zgłasza wyjątek wskaźnika pustego – stebl