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

JasperReports中如何从JSON数组按codScheme值提取对应code?

解决方案:更简洁地从JasperReports的JSON数组中提取指定值

方案1:直接在字段定义中完成提取

可以直接在字段的JSON表达式里用Groovy安全导航操作符(?.)避免空指针,同时修正节点值的访问方式:

<field name="orderClientRef" class="java.lang.String">
    <property name="net.sf.jasperreports.json.field.expression" value="moreIds.find { it.get('codScheme').textValue() == 'CLIENT_REF' }?.get('code')?.textValue()"/>
</field>

定义完成后,直接在报表中使用$F{orderClientRef}即可获取目标值,无需额外处理。

方案2:简化文本字段的Groovy表达式

如果已经定义了moreIds字段,可利用Groovy的属性访问语法(自动映射get()方法)简化代码:

$F{moreIds}.find{ it.codScheme.textValue() == 'CLIENT_REF' }?.code?.textValue()

或者用findResult一步返回目标值,省去后续属性访问步骤:

$F{moreIds}.findResult{ it.codScheme.textValue() == 'CLIENT_REF' ? it.code.textValue() : null }

初始写法无效的原因

你最初的表达式moreIds.find{it.codScheme=='CLIENT_REF'}.code失败,是因为JasperReports的JSON数据源会把每个JSON节点封装成JsonNode对象。直接访问it.codScheme得到的是JsonNode实例而非字符串,因此和'CLIENT_REF'字符串永远无法匹配,必须调用textValue()方法才能获取节点的实际字符串值。

内容的提问来源于stack exchange,提问作者Olivier Gérardin

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 18:22:42