【问题标题】:Poco Iterating Nested JSON ObjectsPoco 迭代嵌套的 JSON 对象
【发布时间】:2023-03-21 15:18:01
【问题描述】:

我有一个带有嵌套对象的 JSON(这是一个虚构的示例,因为真正的 json 更大更复杂)。我需要遍历siblings 对象。我知道如何用数组来做,但找不到任何例子来处理这样的嵌套对象(任何嵌套深度)。

任何想法都值得赞赏。

{
    .......
    "siblings":{
        "Michael":{
            "age":20,
            "lives":"Dodoma"
        },
        "Polyasi":{
            "age":25,
            "lives":"Geita"
        },
        "Kiah":{
            "age":3,
            "lives":"Dar es Salaam"
        }
    }
    ...........
}

【问题讨论】:

  • 查看documentation for Object。它看起来与迭代 std::map 相同。
  • 我假设您指的是ValueMap::iterator。 AFAIK,这是为了价值观。现在我不确定这是否涵盖像我这样的对象以及将值转换为 Poco::JSON::Object 的方式。
  • 我想最好发布带有输入 json 和预期结果的完整示例。
  • 完整的 json 在这里packagist.org/packages/yiisoft/yii2.json 我期望的结果是阅读版本。我已经可以阅读除嵌套 json 之外的所有内容。我将尝试 Value Map 迭代器的想法,看看它是如何工作的

标签: c++ json poco-libraries


【解决方案1】:

所以我发现 ValueMap::Iterator 并不关心它是对象还是原子值,它对待它们是一样的。所以这是我创造的一个例子来实际测试这个。感谢@atomic_alarm 推动我测试我已经放弃的潜在解决方案。

packagist.json 实际上是重命名的 JSON 文件发现 here。这是代码。确保链接到基础库和 json 库。

#include <Poco/JSON/Parser.h>
#include <Poco/Dynamic/Var.h>
#include <string>
#include <fstream>
#include <streambuf>
#include <iostream>

void print_version_names(Poco::JSON::Object::Ptr root);

int main(int argc, char** argv)
{
    //read file
    std::ifstream t("packagist.json");
    std::string json_str((std::istreambuf_iterator<char>(t)),
                 std::istreambuf_iterator<char>());

    Poco::JSON::Parser parser;
    Poco::Dynamic::Var result = parser.parse(json_str);
    Poco::JSON::Object::Ptr json = result.extract<Poco::JSON::Object::Ptr>();

    print_version_names(json);

    return 0;
}

void print_version_names(Poco::JSON::Object::Ptr root)
{
    std::string root_key = "package";
    std::string key = "versions";
    //no checks whether such key acually exists
    Poco::JSON::Object::Ptr package_json = root->getObject(root_key);
    //get the nested objects
    Poco::JSON::Object::Ptr nested_versions = package_json->getObject(key);

    //iterate the map
    Poco::JSON::Object::Iterator it;
    for(it = nested_versions->begin(); it != nested_versions->end(); it++)
    {
        //no check of whether it is an object
        std::cout<<it->first<<"\n";
    }
}

结果:

2.0.0
2.0.0-alpha
2.0.0-beta
2.0.0-rc
2.0.1
2.0.10
2.0.11
2.0.11.1
2.0.11.2
2.0.12
2.0.2
2.0.3
2.0.4
2.0.5
2.0.6
2.0.7
2.0.8
2.0.9

【讨论】:

    猜你喜欢
    • 2020-10-15
    • 1970-01-01
    • 2015-05-09
    • 2021-10-23
    • 2019-07-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-30
    相关资源
    最近更新 更多