You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

FreeMarker中使用?eval_json解析变量JSON字符串报错问题排查

解决FreeMarker中?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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 07:14:50