Fix JSON parsing in analyzeMenuImages for PDF menu imports

The PDF upload goes to analyzeMenuImages.cfm (not analyzeMenuUrl.cfm).
Added control character cleaning, smart quote replacement, and Jackson
fallback parser with error handling.

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

View file

@ -183,8 +183,27 @@
</cfif> </cfif>
<cfset responseText = trim(responseText)> <cfset responseText = trim(responseText)>
<cfset responseText = reReplace(responseText, ",(\s*[\]\}])", "\1", "all")> <cfset responseText = reReplace(responseText, ",(\s*[\]\}])", "\1", "all")>
<!--- Clean control characters and smart typography from PDFs --->
<cfset responseText = reReplace(responseText, "[\x00-\x08\x0B\x0C\x0E-\x1F]", "", "all")>
<cfset responseText = replace(responseText, chr(8216), "'", "all")>
<cfset responseText = replace(responseText, chr(8217), "'", "all")>
<cfset responseText = replace(responseText, chr(8211), "-", "all")>
<cfset responseText = replace(responseText, chr(8212), "-", "all")>
<cfset responseText = replace(responseText, chr(8230), "...", "all")>
<cftry>
<cfset imageResult = deserializeJSON(responseText)> <cfset imageResult = deserializeJSON(responseText)>
<cfcatch type="any">
<!--- Lucee parser failed — try Jackson --->
<cftry>
<cfset objectMapper = createObject("java", "com.fasterxml.jackson.databind.ObjectMapper")>
<cfset imageResult = objectMapper.readValue(responseText, createObject("java", "java.util.LinkedHashMap").getClass())>
<cfcatch type="any">
<cfthrow message="JSON parse error in image response. First 500 chars: #replace(left(responseText, 500), '##', '####', 'all')#">
</cfcatch>
</cftry>
</cfcatch>
</cftry>
<cfset arrayAppend(allResults, imageResult)> <cfset arrayAppend(allResults, imageResult)>
</cfloop> </cfloop>