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

