FreeMarker中使用?eval_json解析变量JSON字符串报错问题排查
?eval_json解析变量报错的问题 问题描述
直接在FreeMarker模板中赋值JSON字符串时,?eval_json能正常解析并遍历数据:
<#assign loanInformation = '{"8":{"loanId":"8","employeeId":"7","loanType":"1","totalAmount":"100000","installmentAmount":"6666.67","remainingBalance":"93333.33","loanTitle":"ELR - EMP739 Umar Naeem (5/1/2024) (House Loan)"}}'> <#assign loanInfoJason = loanInformation?eval_json> <#list loanInfoJason as loan> <tr class="bb"> <td align="center" class="br">${loan.loanTitle}</td> <td align="center" class="br">${loan.installmentAmount}</td> <td align="center">${loan.remainingBalance}</td> </tr> </#list>
但使用变量赋值<#assign loanInformation = record.custrecord_dsc_psf_loan_ded_info_json>后,调用?eval_json报错:
Failed to "?eval_json" string with this error: ---begin-message--- Invalid JSON keyword: "Lorem". Should be one of: true, false, null. If it meant to be a string then it must be quoted. Error location: line 1, column 1: Lorem ipsum dolor sit amet consectetuer ac orci... ^ ---end-message--- The failing expression: ==> loanInformation?eval_json [in template "template" at line 290, column 25] ---- FTL stack trace ("~" means nesting-related): - Failed at: #assign loanInfo = loanInformation... [in template "template" at line 290, column 5]
错误原因
变量record.custrecord_dsc_psf_loan_ded_info_json的实际内容并非合法JSON格式,而是以"Lorem ipsum..."开头的占位文本,不符合JSON语法规范(比如未用双引号包裹字符串、存在非法关键字),导致?eval_json解析失败。
解决方案
1. 验证变量实际内容
先在模板中输出变量值,确认后端返回的内容是否为合法JSON:
<#-- 调试:输出变量内容,检查是否为合法JSON --> ${loanInformation}
如果输出是占位文本或格式错误的内容,需要联系后端开发,确保该字段返回标准格式的JSON字符串(所有字符串用双引号包裹、关键字true/false/null小写、无语法错误)。
2. 添加容错处理
为避免模板崩溃,可在解析时增加默认值或条件判断:
方式一:使用默认值
当解析失败时返回空对象,避免报错:
<#assign loanInfoJson = loanInformation?eval_json!{}> <#list loanInfoJson as loan> <tr class="bb"> <td align="center" class="br">${loan.loanTitle}</td> <td align="center" class="br">${loan.installmentAmount}</td> <td align="center">${loan.remainingBalance}</td> </tr> </#list>
方式二:提前判断格式
用正则粗略判断是否为JSON对象/数组,再执行解析:
<#if loanInformation?matches("^\\{.*\\}$") || loanInformation?matches("^\\[.*\\]$")> <#assign loanInfoJson = loanInformation?eval_json> <#list loanInfoJson as loan> <tr class="bb"> <td align="center" class="br">${loan.loanTitle}</td> <td align="center" class="br">${loan.installmentAmount}</td> <td align="center">${loan.remainingBalance}</td> </tr> </#list> <#else> <tr class="bb"> <td align="center" colspan="3">暂无有效贷款信息</td> </tr> </#if>
内容的提问来源于stack exchange,提问作者AbdulRehman Younas

