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:
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user