How to read Json string starting with square brackets in it?

Viewed 405

I am using c++ code to read json string to retrieve value based on specific key names. Example of my json response from web API is in array format like below.

 [
    {
    "username": "123456",
    "useraddress": "abc",
    "data": [
                {
                    "schedule": true,
                    "task": "abc",
                    "risk": "1",
                } 
            ],
     "date": "0000-00-00"
    }
]

Like the above format is the actual response. I have to retrieve date value using key "date".

My code snippet:

{

std::stringstream jsonString;

boost::property_tree::ptree pt;

jsonString << ws2s(Info).c_str();

boost::property_tree::read_json(jsonString, pt);

std::string date = pt.get<std::string>("date");

}

'Info' in above snippet is wsstring containing json response data.

I can able to retrieve "date" if [] square brackets are removed manually. Since it is array format, if I pass without removing brackets, read_json throws error.

Can somebody help this out?

1 Answers

Yeah. Boost Property Tree is a property tree library, not JSON.

You're in luck though, Boost has a JSON library now https://www.boost.org/doc/libs/1_75_0/libs/json/doc/html/index.html

Note: your input isn't valid JSON either, because JSON doesn't strictly allow trailing commas. You can enable them with an option in Boost JSON though:

Live On Compiler Explorer

#include <boost/json.hpp>
#include <iostream>

int main() {
    std::string input = R"(
         [
            {
            "username": "123456",
            "useraddress": "abc",
            "data": [
                        {
                            "schedule": true,
                            "task": "abc",
                            "risk": "1",
                        } 
                    ],
             "date": "0000-00-00"
            }
        ])";

    boost::json::parse_options options;
    options.allow_trailing_commas = true;
    auto json = boost::json::parse(input, {}, options);

    for (auto& el : json.as_array()) {
        std::cout << el.at("date") << "\n";
    }
}

Prints

"0000-00-00"
Related