json - 如何从 JasperReports 中的另一个数据源 (JSON) 访问字段值?
问题描述
我正在使用 TIBCO Jaspersoft® Studio 6.3.1 final。我正在尝试使用两个数据源(格式为 JSON)创建报告。
JSON的结构如下:
{
"first":
{"parameter1" : 123},
"second":[
{"key" : 1},
{"key" : 2}
]
}
所以我有两个数据源。一个用于第一个对象(firstSource),另一个(secondSource)用于第二个对象(对象数组)。
数组 ( second ) 打印在表格组件中。我想从第一个对象(first.parameter1)访问一个字段并将其打印在表头中。
该表正在使用此数据集:
<datasetRun uuid="4ee63b06-f4ee-45b4-9da8-3dabc3e7a09d">
<dataSourceExpression> <![CDATA[$P{secondSource})]]></dataSourceExpression>
</datasetRun>
然后我使用$F{key}
.
你知道如何从表中访问第一个对象的参数1 吗?也许使用某种 $V{} 变量或合并两个数据源?
我尝试使用 subDataSource 和 subDataSet 方法,但没有任何运气。
这是我想在结果表中实现的目标:
解决方案
让我首先说您有问题的 json 结构不是动态处理预期输出的最佳结构,如果parameter1
实际上在第二个节点内会更好,请参阅如何使用 json 在 jasper 报告中创建多个表作为数据源?如果是这种情况,您将如何处理和访问节点。
反正
是的,你在 jasper 报告中是对的,你应该通过数据源来思考。在您的预期输出中,您基本上有 2 个数据源second
,一个是您的表格,first
一个是您的标题。是的,首先只有 1 条记录,但要访问它,您可以为其创建数据源,然后使用组件或子报表来显示它。
考虑到这一点,您的问题的一种解决方案是
为表创建数据集(字段为
key
),将second
节点作为数据源传递为标题创建一个数据集(字段为
parameter1
),在表中使用此数据集来显示值。
例子
<?xml version="1.0" encoding="UTF-8"?>
<jasperReport xmlns="http://jasperreports.sourceforge.net/jasperreports" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://jasperreports.sourceforge.net/jasperreports http://jasperreports.sourceforge.net/xsd/jasperreport.xsd" name="json_access_var" pageWidth="595" pageHeight="842" whenNoDataType="AllSectionsNoDetail" columnWidth="555" leftMargin="20" rightMargin="20" topMargin="20" bottomMargin="20" uuid="80e30745-0db9-476f-8bbb-cbc60d1ca90f">
<property name="com.jaspersoft.studio.data.defaultdataadapter" value="JsonTest2"/>
<style name="Table_CH" mode="Opaque" backcolor="#BFE1FF">
<box>
<pen lineWidth="0.5" lineColor="#000000"/>
<topPen lineWidth="0.5" lineColor="#000000"/>
<leftPen lineWidth="0.5" lineColor="#000000"/>
<bottomPen lineWidth="0.5" lineColor="#000000"/>
<rightPen lineWidth="0.5" lineColor="#000000"/>
</box>
</style>
<style name="Table_TD" mode="Opaque" backcolor="#FFFFFF">
<box>
<pen lineWidth="0.5" lineColor="#000000"/>
<topPen lineWidth="0.5" lineColor="#000000"/>
<leftPen lineWidth="0.5" lineColor="#000000"/>
<bottomPen lineWidth="0.5" lineColor="#000000"/>
<rightPen lineWidth="0.5" lineColor="#000000"/>
</box>
</style>
<subDataset name="DatasetMain" uuid="7918eaef-d2f7-4cdd-9b84-e2660b2bfed8">
<parameter name="mainDatasource" class="net.sf.jasperreports.engine.data.JsonDataSource"/>
<queryString language="JSON">
<![CDATA[]]>
</queryString>
<field name="key" class="java.lang.String">
<fieldDescription><![CDATA[key]]></fieldDescription>
</field>
</subDataset>
<subDataset name="DatasetTitle" uuid="7918eaef-d2f7-4cdd-9b84-e2660b2bfed8">
<queryString language="JSON">
<![CDATA[]]>
</queryString>
<field name="parameter1" class="java.lang.String">
<fieldDescription><![CDATA[parameter1]]></fieldDescription>
</field>
</subDataset>
<parameter name="JSON_INPUT_STREAM" class="java.io.InputStream" isForPrompting="false"/>
<queryString language="JSON">
<![CDATA[]]>
</queryString>
<summary>
<band height="260" splitType="Stretch">
<componentElement>
<reportElement x="0" y="0" width="200" height="60" uuid="40093b50-bd8d-4d56-8d1d-9f2e9cf86106">
<property name="com.jaspersoft.studio.layout" value="com.jaspersoft.studio.editor.layout.VerticalRowLayout"/>
<property name="com.jaspersoft.studio.table.style.column_header" value="Table_CH"/>
<property name="com.jaspersoft.studio.table.style.detail" value="Table_TD"/>
</reportElement>
<jr:table xmlns:jr="http://jasperreports.sourceforge.net/jasperreports/components" xsi:schemaLocation="http://jasperreports.sourceforge.net/jasperreports/components http://jasperreports.sourceforge.net/xsd/components.xsd">
<datasetRun subDataset="DatasetMain" uuid="0247b2fb-527b-4dc2-af7f-9bcd75e8715a">
<datasetParameter name="mainDatasource">
<datasetParameterExpression><![CDATA[((net.sf.jasperreports.engine.data.JsonDataSource)$P{REPORT_DATA_SOURCE})]]></datasetParameterExpression>
</datasetParameter>
<dataSourceExpression><![CDATA[((net.sf.jasperreports.engine.data.JsonDataSource)$P{REPORT_DATA_SOURCE}).subDataSource("second")]]></dataSourceExpression>
</datasetRun>
<jr:column width="200" uuid="25910003-959c-4e31-a91e-555e4aaf0bec">
<jr:columnHeader style="Table_CH" height="30">
<componentElement>
<reportElement x="0" y="0" width="200" height="30" uuid="da5b13da-671f-4eb6-bbf1-e455b293e4ce"/>
<jr:list printOrder="Vertical">
<datasetRun subDataset="DatasetTitle" uuid="d0a6bf94-cec6-4a75-96ec-4ae046ee90cc">
<dataSourceExpression><![CDATA[((net.sf.jasperreports.engine.data.JsonDataSource)$P{mainDatasource}).subDataSource("first")]]></dataSourceExpression>
</datasetRun>
<jr:listContents height="30" width="200">
<textField>
<reportElement x="0" y="0" width="200" height="30" uuid="2cd239b8-93ac-4cd2-82eb-f22db96dd010"/>
<textElement textAlignment="Center" verticalAlignment="Middle"/>
<textFieldExpression><![CDATA[$F{parameter1}]]></textFieldExpression>
</textField>
</jr:listContents>
</jr:list>
</componentElement>
</jr:columnHeader>
<jr:detailCell style="Table_TD" height="30">
<textField>
<reportElement x="0" y="0" width="200" height="30" uuid="24b2ba9b-57d0-4840-8333-70247f595e21"/>
<textElement textAlignment="Center" verticalAlignment="Middle"/>
<textFieldExpression><![CDATA[$F{key}]]></textFieldExpression>
</textField>
</jr:detailCell>
</jr:column>
</jr:table>
</componentElement>
</band>
</summary>
</jasperReport>
笔记:
在
DatasetMain
我创建一个参数时,我可以在表中再次访问报告主数据源(整个 json 文件)并创建新subDataSource
的first
在标题中,我使用一个
jr:list
组件来显示我的第二个数据源 (parameter1
) 的值,您还可以使用一个简单的子报表来提取该值。
输出(使用有问题提供的 json)
推荐阅读
- java - Guice 将一个对象注入到类构造函数中
- android - Android Studio Vector 资产总是无法生成预览
- java - 如何使用 Hibernate 作为 Vert.x 的非阻塞 ORM
- ocaml - 在 utop 中使用完全限定名称
- wordpress - 如何在网站上隐藏标题产品?
- javascript - WebAssembly/emscripten:从浏览器中将文件写入磁盘
- javascript - 限制while循环的次数
- bash - 如何根据子目录的文件名长度对文件进行排序?
- matlab - 如何更新矩阵行中的值
- python - 如何将字符串列表转换为 Python 中的变量?