Iterating through objects in JsonCpp Iterating through objects in JsonCpp json json

Iterating through objects in JsonCpp


You have some errors related to seemingly not having a great handle on recursion or the key->value nature of JSON and how that relates to the library you're using. I haven't tested this code at all, but it should work better.

void CDriverConfigurator::PrintJSONValue( const Json::Value &val ){    if( val.isString() ) {        printf( "string(%s)", val.asString().c_str() );     } else if( val.isBool() ) {        printf( "bool(%d)", val.asBool() );     } else if( val.isInt() ) {        printf( "int(%d)", val.asInt() );     } else if( val.isUInt() ) {        printf( "uint(%u)", val.asUInt() );     } else if( val.isDouble() ) {        printf( "double(%f)", val.asDouble() );     }    else     {        printf( "unknown type=[%d]", val.type() );     }}bool CDriverConfigurator::PrintJSONTree( const Json::Value &root, unsigned short depth /* = 0 */) {    depth += 1;    printf( " {type=[%d], size=%d}", root.type(), root.size() );     if( root.size() > 0 ) {        printf("\n");        for( Json::Value::const_iterator itr = root.begin() ; itr != root.end() ; itr++ ) {            // Print depth.             for( int tab = 0 ; tab < depth; tab++) {               printf("-");             }            printf(" subvalue(");            PrintJSONValue(itr.key());            printf(") -");            PrintJSONTree( *itr, depth);         }        return true;    } else {        printf(" ");        PrintJSONValue(root);        printf( "\n" );     }    return true;}


If you are just looking to print out the Json::Value, there's a method for that:

Json::Value val;/*...build the value...*/cout << val.toStyledString() << endl;

Also, you may want to look into the Json::StyledWriter, the documentation for it is here. I believe it print a human friendly version. Also, Json::FastWriter, documentation here, prints a more compact form.


This is a good example that can print either json objects and object member (and it's value) :

Json::Value root;               // Json rootJson::Reader parser;            // Json parser// Json contentstring strCarPrices ="{ \"Car Prices\": [{\"Aventador\":\"$393,695\", \"BMW\":\"$40,250\",\"Porsche\":\"$59,000\",\"Koenigsegg Agera\":\"$2.1 Million\"}]}";// Parse the jsonbool bIsParsed = parser.parse( strCarPrices, root );if (bIsParsed == true){    // Get the values    const Json::Value values = root["Car Prices"];    // Print the objects    for ( int i = 0; i < values.size(); i++ )    {        // Print the values        cout << values[i] << endl;        // Print the member names and values individually of an object        for(int j = 0; j < values[i].getMemberNames().size(); j++)        {            // Member name and value            cout << values[i].getMemberNames()[j] << ": " << values[i][values[i].getMemberNames()[j]].asString() << endl;        }    }}else{    cout << "Cannot parse the json content!" << endl;}

The output :

{        "Aventador" : "$393,695",        "BMW" : "$40,250",        "Koenigsegg Agera" : "$2.1 Million",        "Porsche" : "$59,000"}Aventador: $393,695BMW: $40,250Koenigsegg Agera: $2.1 MillionPorsche: $59,000