使用 Boost 库从 C++ 中的 JSON 检索内容

Posted

技术标签:

【中文标题】使用 Boost 库从 C++ 中的 JSON 检索内容【英文标题】:Retrieve content from JSON in C++ using Boost library 【发布时间】:2017-04-17 08:19:02 【问题描述】:

这是我的 JSON 文件。


    "found":3,
    "totalNumPages":1,
    "pageNum":1,
    "results":
    [
        
            "POSTAL":"000000"
        ,
        
            "POSTAL":"111111"
        ,
        
            "POSTAL":"222222"
        
    ]

这是 C++ 代码。

#include <boost/property_tree/ptree.hpp>
#include <boost/property_tree/json_parser.hpp>
#include <iostream>

int main()

    // Short alias for this namespace
    namespace pt = boost::property_tree;

    // Create a root
    pt::ptree root;

    // Load the json file in this ptree
    pt::read_json("filename.json", root);

    std::vector< std::pair<std::string, std::string> > results; 
    // Iterator over all results
    for (pt::ptree::value_type &result : root.get_child("results"))
    
        // Get the label of the node
        std::string label = result.first;
        // Get the content of the node
        std::string content = result.second.data();
        results.push_back(std::make_pair(label, content));
        cout << result.second.data();
    

我需要让每组子值驻留在父级 ("results") 中,但它打印出空白。我试过使用

root.get_child("results.POSTAL") 

但是因为有方括号,会报错。有什么建议吗?

【问题讨论】:

这应该有助于***.com/questions/17124652/… 请养成将确切的错误信息复制到问题中的习惯。 【参考方案1】:

Boost 属性树中的数组表示为具有多个未命名属性的对象。

因此,只需遍历它们:

Live On Coliru

#include <boost/property_tree/ptree.hpp>
#include <boost/property_tree/json_parser.hpp>
#include <iostream>

int main()

    namespace pt = boost::property_tree;
    pt::ptree root;
    pt::read_json("filename.json", root);

    std::vector< std::pair<std::string, std::string> > results; 
    // Iterator over all results
    for (pt::ptree::value_type &result : root.get_child("results."))
        for (pt::ptree::value_type &field : result.second)
            results.push_back(std::make_pair(field.first, field.second.data()));

    for (auto& p : results)
        std::cout << p.first << ": " << p.second << "\n";

打印

POSTAL: 000000
POSTAL: 111111
POSTAL: 222222

【讨论】:

以上是关于使用 Boost 库从 C++ 中的 JSON 检索内容的主要内容,如果未能解决你的问题,请参考以下文章

C++使用boost 1.75版本来读写JSON文件

C++的Json解析库:jsoncpp和boost(转)

将库从依赖项重定位到 package.json 中的 devDependencies 块的命令?

使用 C++ 中的函数动态创建 json 字符串

C++ boost解析动态生成的json字符串(不是文件)

处理大量的Boost头文件