Extracting content from JSON in C ++ using Boost library

This is my JSON file.

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

      

Here is the C ++ code.

#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();
    }
}

      

I need every set of child values ​​to be in parent ( "results"

), but it prints blank. I have tried using

root.get_child("results.POSTAL") 

      

but because of the square bracket, it throws an error. Any advice?

+3


source to share


1 answer


Arrays in the Boost property tree are represented as objects with multiple unnamed properties.

So just flip them over:

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";
}

      

Printing

POSTAL: 000000
POSTAL: 111111
POSTAL: 222222

      

0


source







All Articles