From 243474a635cfd2f7fdb1f8f337e152e622f3e745 Mon Sep 17 00:00:00 2001 From: Valeriy Khakhutskyy <1292899+valeriy42@users.noreply.github.com> Date: Thu, 9 Oct 2025 15:04:23 +0200 Subject: [PATCH 1/2] [ML] Enhance error logging in CJsonStateRestoreTraverser for improved debugging. Added detailed information about token types and stream state during JSON parsing errors. --- lib/core/CJsonStateRestoreTraverser.cc | 68 +++++++++++++++++++++++++- 1 file changed, 66 insertions(+), 2 deletions(-) diff --git a/lib/core/CJsonStateRestoreTraverser.cc b/lib/core/CJsonStateRestoreTraverser.cc index dcf82965f..2b1139a67 100644 --- a/lib/core/CJsonStateRestoreTraverser.cc +++ b/lib/core/CJsonStateRestoreTraverser.cc @@ -314,7 +314,62 @@ bool CJsonStateRestoreTraverser::start() { return false; } - LOG_ERROR(<< "JSON state must be object at root" << m_Handler.s_Type); + // Enhanced error logging with comprehensive debugging information + std::string tokenTypeName; + switch (m_Handler.s_Type) { + case SBoostJsonHandler::E_TokenNull: + tokenTypeName = "null"; + break; + case SBoostJsonHandler::E_TokenKey: + tokenTypeName = "key"; + break; + case SBoostJsonHandler::E_TokenBool: + tokenTypeName = "boolean"; + break; + case SBoostJsonHandler::E_TokenInt64: + tokenTypeName = "int64"; + break; + case SBoostJsonHandler::E_TokenUInt64: + tokenTypeName = "uint64"; + break; + case SBoostJsonHandler::E_TokenDouble: + tokenTypeName = "double"; + break; + case SBoostJsonHandler::E_TokenString: + tokenTypeName = "string"; + break; + case SBoostJsonHandler::E_TokenObjectStart: + tokenTypeName = "object_start"; + break; + case SBoostJsonHandler::E_TokenObjectEnd: + tokenTypeName = "object_end"; + break; + case SBoostJsonHandler::E_TokenArrayStart: + tokenTypeName = "array_start"; + break; + case SBoostJsonHandler::E_TokenArrayEnd: + tokenTypeName = "array_end"; + break; + case SBoostJsonHandler::E_TokenKeyPart: + tokenTypeName = "key_part"; + break; + case SBoostJsonHandler::E_TokenStringPart: + tokenTypeName = "string_part"; + break; + default: + tokenTypeName = "unknown"; + break; + } + + LOG_ERROR(<< "JSON state must be object at root. Found token type: " + << tokenTypeName << " (value: " << m_Handler.s_Type + << "), isArrayOfObjects: " << m_IsArrayOfObjects + << ", isEof: " << this->isEof() + << ", stream state - bad: " << m_ReadStream.bad() + << ", fail: " << m_ReadStream.fail() + << ", eof: " << m_ReadStream.eof() + << ", bytes remaining: " << m_BytesRemaining + << ", buffer position: " << (m_BufferPtr ? (m_BufferPtr - m_Buffer) : -1)); return false; } @@ -349,7 +404,16 @@ bool CJsonStateRestoreTraverser::advance() { } void CJsonStateRestoreTraverser::logError() { - LOG_ERROR(<< "Error parsing JSON: " << m_Reader.last_error()); + LOG_ERROR(<< "Error parsing JSON: " << m_Reader.last_error() + << ", stream state - bad: " << m_ReadStream.bad() + << ", fail: " << m_ReadStream.fail() + << ", eof: " << m_ReadStream.eof() + << ", bytes remaining: " << m_BytesRemaining + << ", buffer position: " << (m_BufferPtr ? (m_BufferPtr - m_Buffer) : -1) + << ", current token type: " << m_Handler.s_Type + << ", isArrayOfObjects: " << m_IsArrayOfObjects + << ", started: " << m_Started + << ", desired level: " << m_DesiredLevel); this->setBadState(); } From 9c1429962545527d6a54589a5da9113bb5bb2140 Mon Sep 17 00:00:00 2001 From: Valeriy Khakhutskyy <1292899+valeriy42@users.noreply.github.com> Date: Fri, 10 Oct 2025 13:27:14 +0200 Subject: [PATCH 2/2] formatting --- lib/core/CJsonStateRestoreTraverser.cc | 109 ++++++++++++------------- 1 file changed, 52 insertions(+), 57 deletions(-) diff --git a/lib/core/CJsonStateRestoreTraverser.cc b/lib/core/CJsonStateRestoreTraverser.cc index 2b1139a67..e3b6d2584 100644 --- a/lib/core/CJsonStateRestoreTraverser.cc +++ b/lib/core/CJsonStateRestoreTraverser.cc @@ -317,59 +317,57 @@ bool CJsonStateRestoreTraverser::start() { // Enhanced error logging with comprehensive debugging information std::string tokenTypeName; switch (m_Handler.s_Type) { - case SBoostJsonHandler::E_TokenNull: - tokenTypeName = "null"; - break; - case SBoostJsonHandler::E_TokenKey: - tokenTypeName = "key"; - break; - case SBoostJsonHandler::E_TokenBool: - tokenTypeName = "boolean"; - break; - case SBoostJsonHandler::E_TokenInt64: - tokenTypeName = "int64"; - break; - case SBoostJsonHandler::E_TokenUInt64: - tokenTypeName = "uint64"; - break; - case SBoostJsonHandler::E_TokenDouble: - tokenTypeName = "double"; - break; - case SBoostJsonHandler::E_TokenString: - tokenTypeName = "string"; - break; - case SBoostJsonHandler::E_TokenObjectStart: - tokenTypeName = "object_start"; - break; - case SBoostJsonHandler::E_TokenObjectEnd: - tokenTypeName = "object_end"; - break; - case SBoostJsonHandler::E_TokenArrayStart: - tokenTypeName = "array_start"; - break; - case SBoostJsonHandler::E_TokenArrayEnd: - tokenTypeName = "array_end"; - break; - case SBoostJsonHandler::E_TokenKeyPart: - tokenTypeName = "key_part"; - break; - case SBoostJsonHandler::E_TokenStringPart: - tokenTypeName = "string_part"; - break; - default: - tokenTypeName = "unknown"; - break; + case SBoostJsonHandler::E_TokenNull: + tokenTypeName = "null"; + break; + case SBoostJsonHandler::E_TokenKey: + tokenTypeName = "key"; + break; + case SBoostJsonHandler::E_TokenBool: + tokenTypeName = "boolean"; + break; + case SBoostJsonHandler::E_TokenInt64: + tokenTypeName = "int64"; + break; + case SBoostJsonHandler::E_TokenUInt64: + tokenTypeName = "uint64"; + break; + case SBoostJsonHandler::E_TokenDouble: + tokenTypeName = "double"; + break; + case SBoostJsonHandler::E_TokenString: + tokenTypeName = "string"; + break; + case SBoostJsonHandler::E_TokenObjectStart: + tokenTypeName = "object_start"; + break; + case SBoostJsonHandler::E_TokenObjectEnd: + tokenTypeName = "object_end"; + break; + case SBoostJsonHandler::E_TokenArrayStart: + tokenTypeName = "array_start"; + break; + case SBoostJsonHandler::E_TokenArrayEnd: + tokenTypeName = "array_end"; + break; + case SBoostJsonHandler::E_TokenKeyPart: + tokenTypeName = "key_part"; + break; + case SBoostJsonHandler::E_TokenStringPart: + tokenTypeName = "string_part"; + break; + default: + tokenTypeName = "unknown"; + break; } - LOG_ERROR(<< "JSON state must be object at root. Found token type: " - << tokenTypeName << " (value: " << m_Handler.s_Type - << "), isArrayOfObjects: " << m_IsArrayOfObjects - << ", isEof: " << this->isEof() - << ", stream state - bad: " << m_ReadStream.bad() - << ", fail: " << m_ReadStream.fail() + LOG_ERROR(<< "JSON state must be object at root. Found token type: " << tokenTypeName + << " (value: " << m_Handler.s_Type << "), isArrayOfObjects: " << m_IsArrayOfObjects + << ", isEof: " << this->isEof() << ", stream state - bad: " + << m_ReadStream.bad() << ", fail: " << m_ReadStream.fail() << ", eof: " << m_ReadStream.eof() - << ", bytes remaining: " << m_BytesRemaining - << ", buffer position: " << (m_BufferPtr ? (m_BufferPtr - m_Buffer) : -1)); + << ", bytes remaining: " << m_BytesRemaining << ", buffer position: " + << (m_BufferPtr ? (m_BufferPtr - m_Buffer) : -1)); return false; } @@ -404,15 +402,12 @@ bool CJsonStateRestoreTraverser::advance() { } void CJsonStateRestoreTraverser::logError() { - LOG_ERROR(<< "Error parsing JSON: " << m_Reader.last_error() - << ", stream state - bad: " << m_ReadStream.bad() - << ", fail: " << m_ReadStream.fail() - << ", eof: " << m_ReadStream.eof() - << ", bytes remaining: " << m_BytesRemaining + LOG_ERROR(<< "Error parsing JSON: " << m_Reader.last_error() << ", stream state - bad: " + << m_ReadStream.bad() << ", fail: " << m_ReadStream.fail() + << ", eof: " << m_ReadStream.eof() << ", bytes remaining: " << m_BytesRemaining << ", buffer position: " << (m_BufferPtr ? (m_BufferPtr - m_Buffer) : -1) << ", current token type: " << m_Handler.s_Type - << ", isArrayOfObjects: " << m_IsArrayOfObjects - << ", started: " << m_Started + << ", isArrayOfObjects: " << m_IsArrayOfObjects << ", started: " << m_Started << ", desired level: " << m_DesiredLevel); this->setBadState(); }