代码之家  ›  专栏  ›  技术社区  ›  Stefano Mtangoo

Poco迭代嵌套JSON对象

  •  0
  • Stefano Mtangoo  · 技术社区  · 7 年前

    我有一个带有嵌套对象的JSON(这里是一个虚构的示例,因为真正的JSON更大、更复杂)。我需要反复浏览 siblings 对象我知道如何使用数组,但找不到任何示例来处理此类嵌套对象(任何嵌套深度)。

    {
        .......
        "siblings":{
            "Michael":{
                "age":20,
                "lives":"Dodoma"
            },
            "Polyasi":{
                "age":25,
                "lives":"Geita"
            },
            "Kiah":{
                "age":3,
                "lives":"Dar es Salaam"
            }
        }
        ...........
    }
    
    1 回复  |  直到 7 年前
        1
  •  1
  •   Stefano Mtangoo    7 年前

    包装商。json实际上重命名为找到的json文件 here .这是代码。确保链接到foundation和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