У меня есть вложенный объект JSON. Я пытаюсь построить его в функции и добавить внутренний объект к оригиналу, но я не могу извлечь результат.Poco C++ здания вложенные объекты 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
}
Итак, у меня есть внутренний объект, который правильно поместить в результат, она печатается через stringify с правильными значениями и result-> имеет() является успешным. Но, в соответствии с результатом, это не объект, массив или нуль, поэтому вы можете получить его с помощью var. Но, как только он получен из var, это не строка, структура, массив или число, а также не пусто. Внутренний объект, кажется, существует и не существует одновременно.
Итак, как я могу поместить этот объект в свой результат? И как мне это понять?
Благодаря
примечание: Я видел эту тему Correct usage of Poco C++ JSON for parsing data, но строит объект JSON из строки, а затем разбор его. Полагаю, я мог бы построить все как строку и преобразовать в объект Poco на последнем шаге, но мне все еще интересно, почему это происходит. Кроме того, использование result-> set() и result-> get() является более чистым, менее разрешенным решением, чем прохождение строки.
Ссылки: Poco JSON Doc, Poco Dynamic Var Doc
Что возвращаемый тип для 'result-> has'' result-> isObject' и т.д.? Если это 'bool', то это неопределенное поведение для использования' bool' в '' printf() ', поскольку для' bool' нет официального спецификатора формата. – PaulMcKenzie
возвращение type - bool. Я заменяю true и false для 1 и 0 в моих комментариях выше. Это не проблема с печатью - я могу отнести их все к int и получить тот же результат, а также в качестве более убедительного теста на нулевой объект, пытаясь использовать ptr из 'ptr = result-> getObject (key)' выбрасывает исключение нулевого указателя – stebl