Important Update:

- Improve "printing" for JSON with single & multi line objects
- Fix bugs in getting, setting & creating array elements
- "array[]" allowed to create/add element at end of an array
- No longer duplicate get() path (reduce memory allocation)
  - added NameLen to TMember to eliminate zero-terminate requirement
- Fix ReadfromXXX() return values
This commit is contained in:
Charl Wentzel
2017-04-05 08:07:53 +02:00
parent 66fc4bc123
commit 200f7e1f8b
3 changed files with 99 additions and 53 deletions

View File

@@ -158,6 +158,7 @@ bool CJSONparse::ReadFromFile( const char * RootPath, const char * Path, const c
bool CJSONparse::ReadFromFile( const char * RootPath, const char * FilePath )
{
int Handle = -1;
bool result = false;
// Validate
if (!DataTree) {
@@ -182,16 +183,18 @@ bool CJSONparse::ReadFromFile( const char * RootPath, const char * FilePath )
}
// Continuously refill buffer while loading
ReadFromHandle( RootPath, Handle, true );
result = ReadFromHandle( RootPath, Handle, true );
// Close File
close( Handle );
return true;
return result;
}
//---------------------------------------------------------------------------
bool CJSONparse::ReadFromHandle( const char * RootPath, int Handle, bool pRefillBuffer )
{
bool result = false;
// Clear Error
Error = false;
@@ -214,14 +217,14 @@ bool CJSONparse::ReadFromHandle( const char * RootPath, int Handle, bool pRefill
// Continuously refill buffer while loading
RefillBuffer = pRefillBuffer;
ReadFromBuffer( RootPath );
result = ReadFromBuffer( RootPath );
RefillBuffer = false;
// Destroy buffer
FreeBuffer();
InputHandle = -1;
return true;
return result;
}
//---------------------------------------------------------------------------
@@ -768,6 +771,7 @@ bool CJSONparse::PrintObject( TDataMember * Object, const int Indent )
TDataMember * Member;
bool First = true;
bool Last = false;
bool MultiLine = false;
int Count = 0;
// Opening brace
@@ -781,6 +785,7 @@ bool CJSONparse::PrintObject( TDataMember * Object, const int Indent )
}
// Save parameters
MultiLine = (Object->Len > 1)? true : false;
for (Member = Object->FirstChild; Member != NULL; (Member = Member->Next))
{
// Whitespace around first bracket
@@ -791,6 +796,9 @@ bool CJSONparse::PrintObject( TDataMember * Object, const int Indent )
write( OutputHandle, "\n", 1 );
write( OutputHandle, Spacer, SpacerLen );
}
else if (MultiLine) {
write( OutputHandle, Spacer, Indent-1 );
}
else {
write( OutputHandle, " ", 1 );
}
@@ -828,15 +836,17 @@ bool CJSONparse::PrintObject( TDataMember * Object, const int Indent )
case jtArray :
PrintArray( Member, Indent );
if (!MultiLine && Member->Len > 1) MultiLine = true;
break;
case jtObject :
PrintObject( Member, Indent );
if (!MultiLine && Member->Len > 1) MultiLine = true;
break;
}
if (!Last)
write( OutputHandle, ",", 1 );
if (Indent)
if (Indent && MultiLine)
write( OutputHandle, "\n", 1 );
}
@@ -847,8 +857,11 @@ bool CJSONparse::PrintObject( TDataMember * Object, const int Indent )
}
// Closing brace
if (Object->Len) {
write( OutputHandle, Spacer, SpacerLen );
if (Indent) {
if (!MultiLine)
write( OutputHandle, " ", 1 );
else
write( OutputHandle, Spacer, SpacerLen );
}
write( OutputHandle, "}", 1 );
return true;
@@ -860,6 +873,7 @@ bool CJSONparse::PrintArray( TDataMember * Array, const int Indent )
TDataMember * Member;
bool First = true;
bool Last = false;
bool MultiLine = false;
int Count = 0;
// Opening brace
@@ -873,15 +887,27 @@ bool CJSONparse::PrintArray( TDataMember * Array, const int Indent )
}
// Save parameters
MultiLine = (Array->Len > 1)? true : false;
for (Member = Array->FirstChild; Member != NULL; (Member = Member->Next))
{
// Whitespace around brace
if (Indent) {
if (First) {
First = false;
write( OutputHandle, "\n", 1 );
if (Array->Name) {
write( OutputHandle, "\n", 1 );
write( OutputHandle, Spacer, SpacerLen );
}
else if (MultiLine) {
write( OutputHandle, Spacer, Indent-1 );
}
else {
write( OutputHandle, " ", 1 );
}
}
else {
write( OutputHandle, Spacer, SpacerLen );
}
write( OutputHandle, Spacer, SpacerLen );
}
Last = (++Count >= Array->Len);
@@ -905,15 +931,17 @@ bool CJSONparse::PrintArray( TDataMember * Array, const int Indent )
case jtArray :
PrintArray( Member, Indent );
if (!MultiLine && Member->Len > 1) MultiLine = true;
break;
case jtObject :
PrintObject( Member, Indent );
if (!MultiLine && Member->Len > 1) MultiLine = true;
break;
}
if (!Last)
write( OutputHandle, ",", 1 );
if (Indent)
if (Indent && MultiLine)
write( OutputHandle, "\n", 1 );
}
@@ -924,8 +952,11 @@ bool CJSONparse::PrintArray( TDataMember * Array, const int Indent )
}
// Closing brace
if (Array->Len) {
write( OutputHandle, Spacer, SpacerLen );
if (Indent) {
if (!MultiLine)
write( OutputHandle, " ", 1 );
else
write( OutputHandle, Spacer, SpacerLen );
}
write( OutputHandle, "]", 1 );
return true;