【发布时间】:2015-05-09 03:44:11
【问题描述】:
我有一个嵌套的 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->has() 是成功的。但是,根据结果,它不是对象、数组或null,所以你应该可以用var获取它。但是,一旦从 var 中获取,它就不是字符串、结构、数组或数字,也不是空的。内在对象似乎同时存在和不存在。
那么,如何将这个对象放入我的结果中?以及如何取出?
谢谢
注意:我看过这个线程Correct usage of Poco C++ JSON for parsing data,但它是从字符串构建 JSON 对象,然后对其进行解析。我想我可以将所有内容构建为字符串并在最后一步转换为 Poco 对象,但我仍然很好奇为什么会发生上述情况。此外,使用 result->set() 和 result->get() 是一种比通过字符串更简洁、更少 hack-y 的解决方案。
【问题讨论】:
-
result->hasresult->isObject等的返回类型是什么?如果是bool,那么在printf()语句中使用bool是未定义的行为,因为bool没有官方格式说明符。 -
返回类型是布尔值。我在上面的 cmets 中用 true 和 false 代替了 1 和 0。这不是打印问题 - 我可以将它们全部转换为 int 并获得相同的结果,也可以作为更确凿的空对象测试,尝试使用来自
ptr=result->getObject(key)的 ptr 会引发空指针异常
标签: c++ json poco-libraries