Skip to content

Commit 7359168

Browse files
authored
[ML] Enhance error logging in CJsonStateRestoreTraverser for improved debugging. (#2867)
Added detailed information about token types and stream state during JSON parsing errors. When you encounter the error now, you'll get detailed information like: JSON state must be object at root. Found token type: string (value: 6), isArrayOfObjects: false, isEof: false, stream state - bad: false, fail: false, eof: false, bytes remaining: 15, buffer position: 0 This will help you understand: What type of JSON content was actually found (string, number, boolean, etc.) Stream health - whether the input stream is corrupted Buffer state - how much data was read and where the parser was positioned Parsing context - whether it was expecting an array of objects or a single object
1 parent 157d0c3 commit 7359168

File tree

1 file changed

+61
-2
lines changed

1 file changed

+61
-2
lines changed

lib/core/CJsonStateRestoreTraverser.cc

Lines changed: 61 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -314,7 +314,60 @@ bool CJsonStateRestoreTraverser::start() {
314314
return false;
315315
}
316316

317-
LOG_ERROR(<< "JSON state must be object at root" << m_Handler.s_Type);
317+
// Enhanced error logging with comprehensive debugging information
318+
std::string tokenTypeName;
319+
switch (m_Handler.s_Type) {
320+
case SBoostJsonHandler::E_TokenNull:
321+
tokenTypeName = "null";
322+
break;
323+
case SBoostJsonHandler::E_TokenKey:
324+
tokenTypeName = "key";
325+
break;
326+
case SBoostJsonHandler::E_TokenBool:
327+
tokenTypeName = "boolean";
328+
break;
329+
case SBoostJsonHandler::E_TokenInt64:
330+
tokenTypeName = "int64";
331+
break;
332+
case SBoostJsonHandler::E_TokenUInt64:
333+
tokenTypeName = "uint64";
334+
break;
335+
case SBoostJsonHandler::E_TokenDouble:
336+
tokenTypeName = "double";
337+
break;
338+
case SBoostJsonHandler::E_TokenString:
339+
tokenTypeName = "string";
340+
break;
341+
case SBoostJsonHandler::E_TokenObjectStart:
342+
tokenTypeName = "object_start";
343+
break;
344+
case SBoostJsonHandler::E_TokenObjectEnd:
345+
tokenTypeName = "object_end";
346+
break;
347+
case SBoostJsonHandler::E_TokenArrayStart:
348+
tokenTypeName = "array_start";
349+
break;
350+
case SBoostJsonHandler::E_TokenArrayEnd:
351+
tokenTypeName = "array_end";
352+
break;
353+
case SBoostJsonHandler::E_TokenKeyPart:
354+
tokenTypeName = "key_part";
355+
break;
356+
case SBoostJsonHandler::E_TokenStringPart:
357+
tokenTypeName = "string_part";
358+
break;
359+
default:
360+
tokenTypeName = "unknown";
361+
break;
362+
}
363+
364+
LOG_ERROR(<< "JSON state must be object at root. Found token type: " << tokenTypeName
365+
<< " (value: " << m_Handler.s_Type << "), isArrayOfObjects: " << m_IsArrayOfObjects
366+
<< ", isEof: " << this->isEof() << ", stream state - bad: "
367+
<< m_ReadStream.bad() << ", fail: " << m_ReadStream.fail()
368+
<< ", eof: " << m_ReadStream.eof()
369+
<< ", bytes remaining: " << m_BytesRemaining << ", buffer position: "
370+
<< (m_BufferPtr ? (m_BufferPtr - m_Buffer) : -1));
318371
return false;
319372
}
320373

@@ -349,7 +402,13 @@ bool CJsonStateRestoreTraverser::advance() {
349402
}
350403

351404
void CJsonStateRestoreTraverser::logError() {
352-
LOG_ERROR(<< "Error parsing JSON: " << m_Reader.last_error());
405+
LOG_ERROR(<< "Error parsing JSON: " << m_Reader.last_error() << ", stream state - bad: "
406+
<< m_ReadStream.bad() << ", fail: " << m_ReadStream.fail()
407+
<< ", eof: " << m_ReadStream.eof() << ", bytes remaining: " << m_BytesRemaining
408+
<< ", buffer position: " << (m_BufferPtr ? (m_BufferPtr - m_Buffer) : -1)
409+
<< ", current token type: " << m_Handler.s_Type
410+
<< ", isArrayOfObjects: " << m_IsArrayOfObjects << ", started: " << m_Started
411+
<< ", desired level: " << m_DesiredLevel);
353412
this->setBadState();
354413
}
355414

0 commit comments

Comments
 (0)