Parsing JSON string with jsoncpp Parsing JSON string with jsoncpp json json

Parsing JSON string with jsoncpp


Your problem is: there is no root["name"]. Your document should be like this:

{ "people": [{"id": 1, "name":"MIKE","surname":"TAYLOR"}, {"id": 2, "name":"TOM","surname":"JERRY"} ]}

And your code like this:

void decode(){    string text ="{ \"people\": [{\"id\": 1, \"name\":\"MIKE\",\"surname\":\"TAYLOR\"}, {\"id\": 2, \"name\":\"TOM\",\"surname\":\"JERRY\"} ]}";    Json::Value root;    Json::Reader reader;    bool parsingSuccessful = reader.parse( text, root );    if ( !parsingSuccessful )    {        cout << "Error parsing the string" << endl;    }    const Json::Value mynames = root["people"];    for ( int index = 0; index < mynames.size(); ++index )    {        cout << mynames[index] << endl;    }}

If you want to keep your data as is:

void decode(){  //string text ="{ \"people\": [{\"id\": 1, \"name\":\"MIKE\",\"surname\":\"TAYLOR\"}, {\"id\": 2, \"name\":\"TOM\",\"surname\":\"JERRY\"} ]}";  string text ="{ \"1\": {\"name\":\"MIKE\",\"surname\":\"TAYLOR\"}, \"2\": {\"name\":\"TOM\",\"surname\":\"JERRY\"} }";  Json::Value root;  Json::Reader reader;  bool parsingSuccessful = reader.parse( text, root );  if ( !parsingSuccessful )  {    cout << "Error parsing the string" << endl;  }  for( Json::Value::const_iterator outer = root.begin() ; outer != root.end() ; outer++ )  {    for( Json::Value::const_iterator inner = (*outer).begin() ; inner!= (*outer).end() ; inner++ )    {      cout << inner.key() << ": " << *inner << endl;    }  }}

Traverse the root object directly, using iterators (don't treat it as it was an array.

If Json::Reader doesn't work, try Json::CharReader instead:

void decode(){  string text ="{\"1\":{\"name\":\"MIKE\",\"surname\":\"TAYLOR\"},\"2\":{\"name\":\"TOM\",\"surname\":\"JERRY\"}}";  Json::CharReaderBuilder builder;  Json::CharReader * reader = builder.newCharReader();  Json::Value root;  string errors;  bool parsingSuccessful = reader->parse(text.c_str(), text.c_str() + text.size(), &root, &errors);  delete reader;  if ( !parsingSuccessful )  {    cout << text << endl;    cout << errors << endl;  }  for( Json::Value::const_iterator outer = root.begin() ; outer != root.end() ; outer++ )  {    for( Json::Value::const_iterator inner = (*outer).begin() ; inner!= (*outer).end() ; inner++ )    {      cout << inner.key() << ": " << *inner << endl;    }  }}


You can also read from a stringstream:

std::stringstream sstr(stringJson);Json::Value json;sstr >> json;