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
相关产品推荐
相关产品推荐

