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

NetSuite高级PDF中无法遍历长文本字段存储的JSON数据

解决NetSuite高级PDF遍历长文本字段JSON数组的问题

问题现象

从NetSuite交易记录的长文本自定义主体字段读取JSON数组,在高级PDF模板中遍历时报错:

Error: For "#list" list source: Expected a sequence or collection, but this has evaluated to a hash+string

但直接在模板里手动赋值JSON数组,却能正常遍历数据。

报错代码示例:

<#assign abc=record.custbodytest["2"]>
<table>
  <#list abc as x>
    <tr><td>${x.vendor}</td></tr>
  </#list>
</table>

正常运行的手动赋值代码示例:

<#assign abc=[{
    "vendor": "test",
    "item": "test",
    "description": "",
    "uom": "",
    "qty": "1"
},{
    "vendor": "test2",
    "item": "test",
    "description": "test",
    "uom": "",
    "qty": "2"
}] >
<table>
  <#list abc as x>
    <tr><td>${x.vendor}</td></tr>
  </#list>
</table>

原因分析

长文本字段存储的JSON是纯字符串格式,Freemarker不会自动将其解析为可遍历的序列/集合类型;而手动赋值的是Freemarker原生支持的数组对象,所以能直接用#list遍历。

解决方案

使用Freemarker的?eval内置函数,将字符串形式的JSON解析为可遍历的对象。注意必须保证字段内的JSON格式完全合法(引号闭合、无语法错误)。

修正后的代码

<#-- 先取出字段中的JSON字符串,再解析为数组 -->
<#assign jsonStr = record.custbodytest["2"]>
<#assign abc = jsonStr?eval>

<table>
  <#list abc as x>
    <tr><td>${x.vendor}</td></tr>
  </#list>
</table>

增强版(处理空值场景)

如果字段可能为空或存储无效JSON,建议添加判断避免解析错误:

<#assign jsonStr = record.custbodytest["2"]!>
<#if jsonStr?trim != "">
  <#assign abc = jsonStr?eval>
  <table>
    <#list abc as x>
      <tr><td>${x.vendor}</td></tr>
    </#list>
  </table>
</#if>

额外注意

手动赋值的示例代码存在两处语法错误(第一个vendor值缺闭合引号、第二个vendor缺值),实际存储JSON时必须修正这类问题,否则?eval会抛出解析失败的错误。

内容的提问来源于stack exchange,提问作者Sanath kumar siripuram

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 02:03:24