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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 16:09:02