gpt4 book ai didi

c++ - Poco C++ 构建嵌套的 JSON 对象

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:21:15 27 4
gpt4 key购买 nike

我有一个嵌套的 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 的解决方案。

引用文献:Poco JSON Doc , Poco Dynamic Var Doc

最佳答案

Poco::JSON 对象和数组默认在内部保存为共享指针(优化以避免值复制)并且一切都是 Dynamic::Var,因此它适用于指针和值。当您插入一个 Object 作为值时,它会起作用,因为 Dynamic::Var 几乎可以容纳任何东西,但是您在检查它时遇到的问题来自这样一个事实,即内部比较不会为 Object 值返回 true,因为它只与默认类型进行比较 - Poco::SharedPtr .

解决方法如下:

void build_object (Poco::JSON::Object * const result)
{
// smart pointer, so don't worry about cleaning up
Poco::JSON::Object::Ptr inner = new Poco::JSON::Object;
inner->set("some_number", 5);
inner->set("some_string", "xyz");

std::string key = "new_object";
result->set(key, inner);
printf("isObject: %i\n", result->isObject(key)); // true
}

我打开了一个github issue以减轻这一警告。

关于c++ - Poco C++ 构建嵌套的 JSON 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28917381/

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