如何按索引将JSON数据项添加到Jaspersoft报表中
在Jaspersoft报表中按索引定位JSON数组元素并单独展示
你有如下JSON数组:
"platDist": [ {"name": "Wordpress", "total": 1360804}, {"name": "Bespoke", "total": 562864} ]
需要将每个name和total放在固定位置的独立文本字段中,而非默认的表格/列表循环展示。目前将name拖拽到Detail band时会循环显示所有值,但$F{name[0]}这类索引写法无法直接获取指定元素,以下是可行解决方案:
核心思路
Jaspersoft默认会把JSON数组的每个元素作为单条记录循环渲染Detail band。要按索引直接访问元素,需先让报表能获取到整个platDist数组对象,再通过JasperReports的集合访问语法取值。
具体实现方式
方式1:直接通过数据源表达式取值
确保报表主数据集的JSON路径指向包含platDist的父节点(而非直接指向platDist数组),然后在文本字段中用以下表达式直接定位元素:
- 获取第一个元素的
name:
<textField> <reportElement x="319" y="51" width="100" height="30" uuid="a76b2855-88bc-49ea-a70d-15d86d8f3c50"/> <textFieldExpression><![CDATA[((net.sf.jasperreports.engine.data.JsonDataSource)$P{REPORT_DATA_SOURCE}).getDataSource("platDist").get(0).getFieldValue("name")]]></textFieldExpression> </textField>
- 获取第二个元素的
total:
<textField> <reportElement x="420" y="51" width="100" height="30" uuid="..."/> <textFieldExpression><![CDATA[((net.sf.jasperreports.engine.data.JsonDataSource)$P{REPORT_DATA_SOURCE}).getDataSource("platDist").get(1).getFieldValue("total")]]></textFieldExpression> </textField>
方式2:通过变量简化表达式
先定义一个变量存储整个platDist数组,后续文本字段直接调用变量:
<variable name="platDistList" class="java.util.List"> <variableExpression><![CDATA[((net.sf.jasperreports.engine.data.JsonDataSource)$P{REPORT_DATA_SOURCE}).getDataSource("platDist").getData()]]></variableExpression> </variable>
之后文本字段表达式可简化为:
<!-- 第一个元素的name --> <textFieldExpression><![CDATA[((java.util.Map)$V{platDistList}.get(0)).get("name")]]></textFieldExpression> <!-- 第二个元素的total --> <textFieldExpression><![CDATA[((java.util.Map)$V{platDistList}.get(1)).get("total")]]></textFieldExpression>
关键注意事项
- 类型转换:JSON数组元素会被解析为
Map对象,必须强制类型转换后才能通过键名取值。 - 数据源路径:如果当前主数据集直接指向
platDist数组(即Detail band对应单个数组元素),需调整数据源路径到父节点,才能访问整个数组对象。
内容的提问来源于stack exchange,提问作者kjs-fgx
相关产品推荐
相关产品推荐

