I'm trying to read in a JSON file. So far I have focused on using the jsoncpp
library. However, the documentation is quite hard to understand for me. Could anyone explain in lay terms what it does?
Say I have a people.json
which looks like this:
{"Anna" : {
"age": 18,
"profession": "student"},
"Ben" : {
"age" : "nineteen",
"profession": "mechanic"}
}
What happens when I read this in? Can I create some sort of data structure people
which I can index by Anna
and Ben
as well as age
and profession
? What would be the data type of people
? I thought it would be something similar to a (nested) map, but map values always have to have the same type, don't they?
I have worked with python before and my "goal" (which may be ill-set for C++) is to obtain the equivalent of a nested python dictionary.
Yes you can create a nested data structure people
which can be indexed by Anna
and Ben
. However, you can't index it directly by age
and profession
(I will get to this part in the code).
The data type of people
is of type Json::Value
(which is defined in jsoncpp). You are right, it is similar to the nested map, but Value
is a data structure which is defined such that multiple types can be stored and accessed. It is similar to a map with a string
as the key and Json::Value
as the value. It could also be a map between an unsigned int
as key and Json::Value
as the value (In case of json arrays).
Here's the code:
//if include <json/value.h> line fails (latest kernels), try also:
// #include <jsoncpp/json/json.h>
#include <json/value.h>
#include <fstream>
std::ifstream people_file("people.json", std::ifstream::binary);
Json::Value people;
people_file >> people;
cout<<people; //This will print the entire json object.
//The following lines will let you access the indexed objects.
cout<<people["Anna"]; //Prints the value for "Anna"
cout<<people["ben"]; //Prints the value for "Ben"
cout<<people["Anna"]["profession"]; //Prints the value corresponding to "profession" in the json for "Anna"
cout<<people["profession"]; //NULL! There is no element with key "profession". Hence a new empty element will be created.
As you can see, you can index the json object only based on the hierarchy of the input data.