Resources for reading

https://rapidjson.org/md_doc_tutorial.html

Reading json from a String

//rapidjson needs:
#include "rapidjson/document.h"
using namespace rapidjson;

	//Open json for reading
	Document JsonDocument;
	Value::ConstMemberIterator JsonField;
	Value::ConstMemberIterator JsonFieldNested1;
	string JsonFieldName;
	string JsonFieldString;
	int JsonFieldInt;

	if (!JsonDocument.Parse(MyJsonString.c_str()).HasParseError())
	{

		//Getting a string
		JsonField = JsonDocument.FindMember("MyFieldName1");
		if ( (JsonField != JsonDocument.MemberEnd()) && (JsonField->value.IsString()) )
			JsonFieldString = JsonField->value.GetString();


		//Getting an int
		JsonField = JsonDocument.FindMember("MyFieldName2");
		if ( (JsonField != JsonDocument.MemberEnd()) && (JsonField->value.IsInt()) )
			JsonFieldInt = JsonField->value.GetInt();


		//Getting a nested field (you can't read nested fields as a new string, they are an object)
		JsonField = JsonDocument.FindMember("MyFieldName3");
		if ( (JsonField != JsonDocument.MemberEnd()) && (JsonField->value.IsObject()) )
		{
			JsonFieldNested1 = JsonField->value.FindMember("MySubFieldName1");
			if ( (JsonFieldNested1 != JsonDocument.MemberEnd()) && (JsonFieldNested1->value.IsString()) )
			{
				MyString = JsonFieldNested1->value.GetString();
			}
		}

		//Iterating through nested fields (e.g. "MyFieldWithSubFields": { "MySubfield1": "abc", "MySubfield2": "24" }
		JsonField = JsonDocument.FindMember("MyFieldWithSubFields");
		if ( (JsonField != JsonDocument.MemberEnd()) && (JsonField->value.IsObject()) )		//Structures in a json doc are not a string in rapidjson and can't be read as a string, they are an object
		{
			//ITERATE THROUGH EACH MEMBER
			for (Value::ConstMemberIterator JsonIteratorMember = JsonField->value.MemberBegin(); JsonIteratorMember != JsonField->value.MemberEnd(); ++JsonIteratorMember)
			{
				//Get key name
				JsonFieldName = JsonIteratorMember->name.GetString();

				//Get value
				if (JsonIteratorMember->value.IsNumber())
				{
					JsonFieldInt = JsonIteratorMember->value.GetInt();
				}
				else if (JsonIteratorMember->value.IsString())
				{
					JsonFieldString = JsonIteratorMember->value.GetString();
				}
				else if (JsonIteratorMember->value.IsBool())
				{
					JsonFieldInt = (int)JsonIteratorMember->value.GetBool();
				}
				else if (JsonIteratorMember->value.IsArray())
				{
					for (SizeType Index = 0; Index < JsonIteratorMember->value.Size(); Index++)
					{
						if (JsonIteratorMember->value[Index].IsNumber())
						{
							JsonFieldInt = JsonIteratorMember->value[Index].GetInt() ;
						}
						else if (JsonIteratorMember->value[Index].IsString())
						{
							JsonFieldString = JsonIteratorMember->value[Index].GetString();
						}
						else if (JsonIteratorMember->value[Index].IsBool())
						{
							JsonFieldInt = (int)JsonIteratorMember->value[Index].GetBool();
						}
					}
				}

			} //for (Value::ConstMemberIterator JsonIteratorMember = JsonField->value.MemberBegin(); JsonIteratorMember != JsonField->value.MemberEnd(); ++JsonIteratorMember)
		}


	} //if (!JsonDocument.Parse(MyJsonString.c_str()).HasParseError())

Get json value functions

Calling
	JsonField = JsonDocument.FindMember("MyFieldName1");
	if (JsonField != JsonDocument.MemberEnd())
		JsonFieldString = JsonFieldGetValueAsString(JsonField);
The functions

//****************************************************
//****************************************************
//********** JSON FIELD GET VALUE AS STRING **********
//****************************************************
//****************************************************
//We always return a string regardless of json value type
string JsonFieldGetValueAsString (Value::ConstMemberIterator JsonField)
{
	stringstream ss1;
	
	if (JsonField->value.IsInt())
		ss1 << JsonField->value.GetInt();
	else if (JsonField->value.IsInt64())
		ss1 << JsonField->value.GetInt64();
	else if (JsonField->value.IsDouble())
		ss1 << JsonField->value.GetDouble();
	else if (JsonField->value.IsUint())
		ss1 << JsonField->value.GetUint();
	else if (JsonField->value.IsUint64())
		ss1 << JsonField->value.GetUint64();
	else if (JsonField->value.IsNumber())
		ss1 << JsonField->value.GetInt();
	else if (JsonField->value.IsBool())
		ss1 << (int)(JsonField->value.GetBool() ? 1 : 0);
	else if (JsonField->value.IsString())
		ss1 << JsonField->value.GetString();
	else
		ss1 << "";
	
	return (ss1.str());
}


//*************************************************
//*************************************************
//********** JSON FIELD GET VALUE AS INT **********
//*************************************************
//*************************************************
//We always return an int64 regardless of json value type
//Defaults to 0
int64_t JsonFieldGetValueAsInt64 (Value::ConstMemberIterator JsonField)
{
	stringstream ss1;
	int64_t Value;
	
	if (JsonField->value.IsInt())
		Value = JsonField->value.GetInt();
	else if (JsonField->value.IsInt64())
		Value = JsonField->value.GetInt64();
	else if (JsonField->value.IsDouble())
		Value = rint(JsonField->value.GetDouble());
	else if (JsonField->value.IsUint())
		Value = JsonField->value.GetUint();
	else if (JsonField->value.IsUint64())
		Value = JsonField->value.GetUint64();
	else if (JsonField->value.IsNumber())
		Value = JsonField->value.GetInt();
	else if (JsonField->value.IsBool())
		Value = (uint64_t)(JsonField->value.GetBool() ? 1 : 0);
	else if (JsonField->value.IsString())
	{
		ss1 << JsonField->value.GetString();
		ss1 >> Value;
	}
	else
		Value = 0;
	
	return(Value);
}


//****************************************************
//****************************************************
//********** JSON FIELD GET VALUE AS DOUBLE **********
//****************************************************
//****************************************************
//We always return an double regardless of json value type
//Defaults to 0
double JsonFieldGetValueAsDouble (Value::ConstMemberIterator JsonField)
{
	stringstream ss1;
	double Value;
	
	if (JsonField->value.IsInt())
		Value = (double)JsonField->value.GetInt();
	else if (JsonField->value.IsInt64())
		Value = (double)JsonField->value.GetInt64();
	else if (JsonField->value.IsDouble())
		Value = JsonField->value.GetDouble();
	else if (JsonField->value.IsUint())
		Value = (double)JsonField->value.GetUint();
	else if (JsonField->value.IsUint64())
		Value = (double)JsonField->value.GetUint64();
	else if (JsonField->value.IsNumber())
		Value = (double)JsonField->value.GetInt();
	else if (JsonField->value.IsBool())
		Value = (double)(JsonField->value.GetBool() ? 1 : 0);
	else if (JsonField->value.IsString())
	{
		ss1 << JsonField->value.GetString();
		ss1 >> Value;
	}
	else
		Value = 0;
	
	return(Value);
}

Read json from a file

#include "rapidjson/filereadstream.h"
#include <cstdio>
using namespace rapidjson;

	FILE* MyFile = fopen(FilePath.str().c_str(), "r");
	char ReadBuffer[65536];
	FileReadStream MyJsonReadStream(MyFile, ReadBuffer, sizeof(ReadBuffer));
	if(MyFile != NULL)
		fclose(MyFile);
	if (!JsonDocument.ParseStream(MyJsonReadStream).HasParseError())
	{