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:
parent
a5c0d55aa8
commit
8ac6800d47
1 changed files with 19 additions and 18 deletions
|
|
@ -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>
|
||||||
|
|
|
||||||
Reference in a new issue