我有一个具有以下结构的JSON数据
[{
"a1":"b1",
"a2":"b2",
"details1":[{"a1":"b1"}],
"details2":[{"a2":"b2"}],
},
{
"a1":"b1",
"a2":"b2",
"details1":[{"a1":"b1"}],
"details2":[{"a2":"b2"}],
},
{
"a1":"b1",
"a2":"b2",
"details1":[{"a1":"b1"}],
"details2":[{"a2":"b2"}],
}]
我为details1和details2数组创建了单独的报告。 此外,我还为主表的一个元素创建了一个报告,详细说明了details1和details2报告作为子报告。
问题是主报告只打印第一个元素中的a1和a2,然后打印来自所有元素的所有details1和details2表中的所有元素。
我的目标是创建一个报告,从主表的第一个元素打印a1,a2,details1,details2,然后是第二个元素,依此类推。我该如何实现呢?
换句话说,如何在JSON数组上迭代相同的报表模板?
答案 0 :(得分:4)
您无需创建子报表即可访问嵌套数组。更简单的解决方案是使用subDataset
s。
在您的情况下,您需要为JSON源中的每个详细信息密钥创建subDatasets:
<subDataset name="details1" uuid="4563e834-a9e5-43b5-9f0a-824948c73c73">
<field name="A1" class="java.lang.String">
<fieldDescription><![CDATA[a1]]></fieldDescription>
</field>
</subDataset>
<subDataset name="details2" uuid="f703cb76-2a4a-44f1-9a42-227e180038d2">
<field name="A2" class="java.lang.String">
<fieldDescription><![CDATA[a2]]></fieldDescription>
</field>
</subDataset>
您的主查询必须为空才能迭代主JSON源中的每个对象:
<queryString language="json">
<![CDATA[]]>
</queryString>
然后,您需要使用一个知道如何处理subDataset的结构,如表或列表。我在这里选择一个列表,因为它更容易使用。对于第一个subDataset,您将拥有:
<componentElement>
<reportElement x="90" y="40" width="333" height="20" uuid="c3237c70-6b2e-43e3-aa21-5092d8b91afc"/>
<jr:list xmlns:jr="http://jasperreports.sourceforge.net/jasperreports/components" xsi:schemaLocation="http://jasperreports.sourceforge.net/jasperreports/components http://jasperreports.sourceforge.net/xsd/components.xsd" printOrder="Vertical">
<datasetRun subDataset="details1" uuid="f5fdc6a3-736f-43ce-b549-cd7332d19eb8">
<dataSourceExpression><![CDATA[((net.sf.jasperreports.engine.data.JsonDataSource)$P{REPORT_DATA_SOURCE}).subDataSource("details1")]]></dataSourceExpression>
</datasetRun>
<jr:listContents height="20" width="333">
<textField>
<reportElement x="10" y="0" width="130" height="20" uuid="07e3ff2a-3832-4b06-9275-cb1ee8e51cfe"/>
<textFieldExpression><![CDATA[$F{A1}]]></textFieldExpression>
</textField>
</jr:listContents>
</jr:list>
</componentElement>
对于第二个子数据集,列表组件是相同的。
这是一个带有完整解决方案的简单JRXML:
<?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="Report" pageWidth="595" pageHeight="842" columnWidth="555" leftMargin="20" rightMargin="20" topMargin="20" bottomMargin="20" uuid="81afe112-ee1b-4443-8d1c-cb6d9ab95dd8">
<property name="com.jaspersoft.studio.data.defaultdataadapter" value="JsonArrayDataAdapter.xml"/>
<subDataset name="details1" uuid="4563e834-a9e5-43b5-9f0a-824948c73c73">
<field name="A1" class="java.lang.String">
<fieldDescription><![CDATA[a1]]></fieldDescription>
</field>
</subDataset>
<subDataset name="details2" uuid="f703cb76-2a4a-44f1-9a42-227e180038d2">
<field name="A2" class="java.lang.String">
<fieldDescription><![CDATA[a2]]></fieldDescription>
</field>
</subDataset>
<queryString language="json">
<![CDATA[]]>
</queryString>
<field name="A1" class="java.lang.String">
<fieldDescription><![CDATA[a1]]></fieldDescription>
</field>
<field name="A2" class="java.lang.String">
<fieldDescription><![CDATA[a2]]></fieldDescription>
</field>
<detail>
<band height="99" splitType="Stretch">
<textField>
<reportElement x="72" y="16" width="100" height="24" uuid="698866c8-7d26-4bc7-8727-b4a56d239a53"/>
<textFieldExpression><![CDATA[$F{A1}]]></textFieldExpression>
</textField>
<textField>
<reportElement x="190" y="16" width="100" height="24" uuid="e775c6c0-4058-4bc4-8c7a-d4d381fd6e66"/>
<textFieldExpression><![CDATA[$F{A2}]]></textFieldExpression>
</textField>
<componentElement>
<reportElement x="90" y="40" width="333" height="20" uuid="c3237c70-6b2e-43e3-aa21-5092d8b91afc"/>
<jr:list xmlns:jr="http://jasperreports.sourceforge.net/jasperreports/components" xsi:schemaLocation="http://jasperreports.sourceforge.net/jasperreports/components http://jasperreports.sourceforge.net/xsd/components.xsd" printOrder="Vertical">
<datasetRun subDataset="details1" uuid="f5fdc6a3-736f-43ce-b549-cd7332d19eb8">
<dataSourceExpression><![CDATA[((net.sf.jasperreports.engine.data.JsonDataSource)$P{REPORT_DATA_SOURCE}).subDataSource("details1")]]></dataSourceExpression>
</datasetRun>
<jr:listContents height="20" width="333">
<textField>
<reportElement x="10" y="0" width="130" height="20" uuid="07e3ff2a-3832-4b06-9275-cb1ee8e51cfe"/>
<textFieldExpression><![CDATA[$F{A1}]]></textFieldExpression>
</textField>
</jr:listContents>
</jr:list>
</componentElement>
<componentElement>
<reportElement x="90" y="60" width="333" height="20" uuid="38f3ac11-ad3e-464c-813a-46132f23783f"/>
<jr:list xmlns:jr="http://jasperreports.sourceforge.net/jasperreports/components" xsi:schemaLocation="http://jasperreports.sourceforge.net/jasperreports/components http://jasperreports.sourceforge.net/xsd/components.xsd" printOrder="Vertical">
<datasetRun subDataset="details2" uuid="833a13c3-e9b8-4f56-9f8f-279d32d403e8">
<dataSourceExpression><![CDATA[((net.sf.jasperreports.engine.data.JsonDataSource)$P{REPORT_DATA_SOURCE}).subDataSource("details2")]]></dataSourceExpression>
</datasetRun>
<jr:listContents height="20" width="333">
<textField>
<reportElement x="10" y="0" width="130" height="20" uuid="3d9fb513-bfc9-4d95-a3da-16b95cf15e7c"/>
<textFieldExpression><![CDATA[$F{A2}]]></textFieldExpression>
</textField>
</jr:listContents>
</jr:list>
</componentElement>
</band>
</detail>
</jasperReport>