Use Jackson parser via file for Claude JSON response

Lucee's deserializeJSON fails on certain Claude outputs and the error
bypasses inner cftry/cfcatch. Parse via Jackson from file instead.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
John Mizerek 2026-03-09 19:37:42 -07:00
parent a5c0d55aa8
commit 8ac6800d47

View file

@ -2240,30 +2240,31 @@
<cfset responseText = replace(responseText, chr(8212), "-", 'all')> <cfset responseText = replace(responseText, chr(8212), "-", 'all')>
<cfset responseText = replace(responseText, chr(8230), "...", 'all')> <cfset responseText = replace(responseText, chr(8230), "...", 'all')>
<!--- Try to parse JSON with error handling ---> <!--- Write raw response to temp file, then parse via Java to avoid Lucee deserializeJSON issues --->
<cfset tempJsonFile = expandPath("/uploads/temp_claude_response.json")>
<cfset fileWrite(tempJsonFile, responseText, "utf-8")>
<cftry> <cftry>
<cfset menuData = deserializeJSON(responseText)> <cfset objectMapper = createObject("java", "com.fasterxml.jackson.databind.ObjectMapper")>
<cfset javaFile = createObject("java", "java.io.File").init(tempJsonFile)>
<cfset javaMap = objectMapper.readValue(javaFile, createObject("java", "java.util.LinkedHashMap").getClass())>
<cfset menuData = deserializeJSON(objectMapper.writeValueAsString(javaMap))>
<cfcatch type="any"> <cfcatch type="any">
<!--- Lucee failed - try Jackson (bundled with Lucee) which is more lenient ---> <!--- Jackson also failed — try Lucee as fallback --->
<cftry> <cftry>
<cfset objectMapper = createObject("java", "com.fasterxml.jackson.databind.ObjectMapper")> <cfset menuData = deserializeJSON(responseText)>
<cfset javaMap = objectMapper.readValue(responseText, createObject("java", "java.util.LinkedHashMap").getClass())> <cfcatch type="any">
<cfset menuData = deserializeJSON(objectMapper.writeValueAsString(javaMap))> <cfset response["OK"] = false>
<cfcatch type="any"> <cfset response["MESSAGE"] = "JSON parse error">
<!--- Both parsers failed — save raw response to file for debugging ---> <cfset response["DEBUG_RAW_RESPONSE"] = left(responseText, 3000)>
<cfset debugFile = expandPath("/uploads/debug_claude_response.json")> <cfcontent type="application/json" reset="true">
<cfset fileWrite(debugFile, responseText)> <cfoutput>#serializeJSON(response)#</cfoutput>
<cfset response["success"] = false> <cfabort>
<cfset response["error"] = "JSON parse error - raw response saved to debug file"> </cfcatch>
<cfset response["DEBUG_RAW_RESPONSE"] = left(responseText, 3000)>
<cfset response["DEBUG_RESPONSE_LENGTH"] = len(responseText)>
<cfcontent type="application/json" reset="true">
<cfoutput>#serializeJSON(response)#</cfoutput>
<cfabort>
</cfcatch>
</cftry> </cftry>
</cfcatch> </cfcatch>
</cftry> </cftry>
<!--- Clean up temp file --->
<cftry><cfset fileDelete(tempJsonFile)><cfcatch></cfcatch></cftry>
<!--- Debug: save raw Claude response before processing ---> <!--- Debug: save raw Claude response before processing --->
<cfset response["DEBUG_RAW_CLAUDE"] = responseText> <cfset response["DEBUG_RAW_CLAUDE"] = responseText>