Iterating through objects in JsonCpp
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.
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;
}
This is a good example that can print either json
objects and object member (and it's value) :
Json::Value root; // Json root
Json::Reader parser; // Json parser
// Json content
string strCarPrices ="{ \"Car Prices\": [{\"Aventador\":\"$393,695\", \"BMW\":\"$40,250\",\"Porsche\":\"$59,000\",\"Koenigsegg Agera\":\"$2.1 Million\"}]}";
// Parse the json
bool 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,695
BMW: $40,250
Koenigsegg Agera: $2.1 Million
Porsche: $59,000