Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Reading json files in C++

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.

like image 831
user3515814 Avatar asked Aug 25 '15 13:08

user3515814


People also ask

What is C JSON?

JSON-C implements a reference counting object model that allows you to easily construct JSON objects in C, output them as JSON formatted strings and parse JSON formatted strings back into the C representation of JSON objects. It aims to conform to RFC 7159.

How do I read a JSON file in CPP?

Here's the code: #include <json/value. h> #include <fstream> std::ifstream people_file("people. json", std::ifstream::binary); people_file >> people; cout<<people; //This will print the entire json object. //The following lines will let you access the indexed objects.


3 Answers

  1. 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).

  2. 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:

#include <json/value.h> #include <fstream>  std::ifstream people_file("people.json", std::ifstream::binary); 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.

like image 65
Pooja Nilangekar Avatar answered Sep 16 '22 15:09

Pooja Nilangekar


Have a look at nlohmann's JSON Repository on GitHub. I have found that it is the most convenient way to work with JSON.

It is designed to behave just like an STL container, which makes its usage very intuitive.

like image 25
Arsen Avatar answered Sep 20 '22 15:09

Arsen


Essentially javascript and C++ work on two different principles. Javascript creates an "associative array" or hash table, which matches a string key, which is the field name, to a value. C++ lays out structures in memory, so the first 4 bytes are an integer, which is an age, then maybe we have a fixed-wth 32 byte string which represents the "profession".

So javascript will handle things like "age" being 18 in one record and "nineteen" in another. C++ can't. (However C++ is much faster).

So if we want to handle JSON in C++, we have to build the associative array from the ground up. Then we have to tag the values with their types. Is it an integer, a real value (probably return as "double"), boolean, a string? It follows that a JSON C++ class is quite a large chunk of code. Effectively what we are doing is implementing a bit of the javascript engine in C++. We then pass our JSON parser the JSON as a string, and it tokenises it, and gives us functions to query the JSON from C++.

like image 35
Malcolm McLean Avatar answered Sep 17 '22 15:09

Malcolm McLean