NetSuite环境下FreeMarker从序列取值报错问题咨询
问题根源
报错的核心原因是你定义getOps变量的方式生成的是纯文本字符串,而非FreeMarker可结构化访问的序列/哈希对象:
- 你使用
<#assign getOps>...</#assign>的捕获语法,本质是把<#list>循环输出的所有内容拼接为普通字符串,即使内容看起来符合JSON结构,也无法直接用.运算符或下标访问内部字段,这就是报错提示「期望哈希类型但实际得到字符串」的原因。
解决方案
方案1(推荐):直接构造FreeMarker结构化序列
不需要通过捕获输出拼接内容,直接在循环中往序列里追加哈希对象即可,代码如下:
<#-- 初始化空序列 --> <#assign getOps = []> <#list record.item as assembly> <#-- 每次循环往序列追加包含对应字段的哈希对象 --> <#assign getOps = getOps + [ { "item": assembly.item, "op": assembly.operationsequencenumber } ]> </#list>
构造完成后即可直接按索引访问对应字段,注意FreeMarker序列下标从0开始:
<#-- 访问第1条记录的item字段 --> ${getOps[0].item} <#-- 访问第2条记录的op字段 --> ${getOps[1].op}
方案2:解析拼接的JSON字符串为结构化对象
如果你坚持用原有捕获输出的写法,需要先把拼接的内容调整为合法JSON数组格式,再用FreeMarker内置函数解析为可访问的对象:
<#-- 拼接合法的JSON数组,注意元素之间加逗号,外层包方括号 --> <#assign getOps> [ <#list record.item as assembly> <#if assembly_has_next>,</#if> {"item": "${assembly.item}", "op": "${assembly.operationsequencenumber}"} </#list> ] </#assign> <#-- 把JSON字符串解析为结构化对象 --> <#assign opsData = getOps?eval_from_json>
之后就可以通过opsData变量访问字段:
${opsData[0].item}
该方案需要严格保证拼接的内容符合JSON格式,否则会出现解析报错,更推荐使用方案1。
内容的提问来源于stack exchange,提问作者Arif WB
相关产品推荐
相关产品推荐

