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())
{
