Search code examples
c++jsonboost

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


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?


Solution

  • 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"