I am parsing below sample file in below code snippet.

{"requestType":"INVOCATION", "hostName":"localhost", "serviceName":"bucky", "serviceType":"DISCRETE", "serviceParameters":"sampleData", "servicesList" :[ { "serviceName" : "ABC", "serviceParameters" : {"para1" : "value1", "para2" : "value2", "para3" : "value3"} }, {"serviceName" : "CBA", "serviceParameters" : { "para1" : "value90", "para2" : "value", "para3" : "value"} } ], "dataTransferMode":null }

code snippet:
#include <boost/property_tree/ptree.hpp>
#include <boost/property_tree/json_parser.hpp>
#include <sstream>
#include <iostream>
#include <boost/foreach.hpp>
#include <map>
using boost::property_tree::ptree;
using namespace std;

void print(boost::property_tree::ptree const& pt,vector <string> &service_list, map <string,string> &service_param)
{   
    using boost::property_tree::ptree;
    ptree::const_iterator end = pt.end();
    string value;
    for (ptree::const_iterator it = pt.begin(); it != end; ++it) {
               //cout<<it->first<<":"<<it->second.get_value<std::string>()<<endl;

                if(it->first == "serviceName")
                {
                     value = it->second.get_value<std::string>();
                    service_list.push_back(it->second.get_value<std::string>());
                }

                 if(it->first == "para1")
                {   

                    service_param[it->first]=it->second.get_value<std::string>();

                }

                 if(it->first == "para2" )
                {  
                    service_param [it->first]=it->second.get_value<std::string>();

                }

                 if(it->first == "para3" )
                {   
                     service_param [it->first]=it->second.get_value<std::string>();
                }

        print(it->second,service_list,service_param);

    }
}

int main() {

vector <string> service_list; 
map <string,string> service_param_rgbd;
map <string,map<string,string>> map_name;
std::ifstream file( "sample" );
    std::stringstream ss;

    if ( file )
    {
        ss << file.rdbuf();
        cout<<"done";
        file.close();
    }

    boost::property_tree::ptree pt;
    boost::property_tree::read_json(ss, pt);

try
{
    BOOST_FOREACH(boost::property_tree::ptree::value_type &v, pt.get_child("servicesList"))
        {
            assert(v.first.empty()); // array elements have no names
            print(v.second,service_list,service_param_rgbd);

        }

 for(auto itr: service_list )
       {

        cout<<itr<<endl;
       } 

for(auto itr: service_param_rgbd )
       {
       if(find(service_list.begin(),service_list.end(),"ABC")!=service_list.end())
        {
       map_name["ABC"][itr.first]=itr.second;
        }

       } 

   for(auto &i : map_name)
    {

    for(auto &j:i.second)
           {
             cout<<j.first <<":"<<j.second<<endl;

             }

     }

return EXIT_SUCCESS;

}

    catch (std::exception const& e)
    {
        std::cerr << e.what() << std::endl;
    }
    return EXIT_FAILURE
}

In above code i need to populate vector and map in order to have mapping between service name and service parameter and for the same map > map_name needs to be created.

so in current scenario inside loop itself i want to create the nested map so that i will have mapping of service name and corresponding parameters . As per below code snippet here in outer loop i->first will iterate the service name and inner loop will provide me corresponding parameters (para1=>value1,para2=>value2) . This way both service name and corresponding parameters can be tied in one map.

for(auto &i : map_name) {
    for(auto &j:i.second)
           {
             cout<<j.first <<":"<<j.second<<endl;

             }

     }

Can anybody let me know the efficient approach for the same as in this approach :

(a) Separate nested map needs to be created for each of the services. (b) same param name for both services name will not work and different-2 services with same param name can't be differentiated.

Thanks.yes i got answer from stackoverflow and full satisfied with this.

Be a part of the DaniWeb community

We're a friendly, industry-focused community of developers, IT pros, digital marketers, and technology enthusiasts meeting, networking, learning, and sharing knowledge.