假设我们有这个 JSON:
{
"header" : "some header",
"strings": [
"foo",
"bar",
"baz"
]
}
我们希望将其显示在 jasper 报告中 - 标题作为文本字段,数组显示在列表中。
这是报告,它可以访问数组,但不显示其中的所有元素 - 仅显示其中的第一个元素。
<?xml version="1.0" encoding="UTF-8"?>
<!-- Created with Jaspersoft Studio version 6.17.0.final using JasperReports Library version 6.17.0-6d93193241dd8cc42629e188b94f9e0bc5722efd -->
<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="sample" pageWidth="595" pageHeight="100" columnWidth="555" leftMargin="20" rightMargin="20" topMargin="20" bottomMargin="20" isIgnorePagination="true" uuid="6c570f43-054a-44a9-a9b1-ba4cf2cdcf86">
<property name="com.jaspersoft.studio.data.defaultdataadapter" value="json-sample"/>
<subDataset name="ListDataSet" uuid="fb812d2a-cb63-473c-b7d3-149977476dd0">
<field name="val" class="java.lang.String">
<property name="net.sf.jasperreports.jsonql.field.expression" value="strings.*"/>
</field>
</subDataset>
<queryString language="jsonql">
<![CDATA[]]>
</queryString>
<field name="header" class="java.lang.String">
<property name="net.sf.jasperreports.jsonql.field.expression" value="header"/>
<fieldDescription><![CDATA[header]]></fieldDescription>
</field>
<field name="strings" class="java.lang.String">
<property name="net.sf.jasperreports.jsonql.field.expression" value="strings"/>
<fieldDescription><![CDATA[strings]]></fieldDescription>
</field>
<background>
<band splitType="Stretch"/>
</background>
<pageHeader>
<band height="30" splitType="Stretch">
<textField>
<reportElement x="0" y="0" width="100" height="30" uuid="d98a55eb-ebbd-4cdd-8fa2-ae052b124aaa"/>
<textFieldExpression><![CDATA[$F{header}]]></textFieldExpression>
</textField>
</band>
</pageHeader>
<detail>
<band height="30" splitType="Stretch">
<componentElement>
<reportElement x="0" y="0" width="450" height="30" uuid="887dc258-2eac-4492-ae69-f9b2ffd1faee">
<property name="com.jaspersoft.studio.unit.CONTENTS.width" value="px"/>
</reportElement>
<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="Horizontal">
<datasetRun subDataset="ListDataSet" uuid="1316cfd7-fe59-440f-a155-501914c00056">
<dataSourceExpression><![CDATA[((net.sf.jasperreports.engine.data.JsonQLDataSource)($P{REPORT_DATA_SOURCE})).subDataSource()]]></dataSourceExpression>
</datasetRun>
<jr:listContents height="30" width="100">
<textField>
<reportElement x="0" y="0" width="90" height="30" uuid="4ee2d6b3-c681-433f-a170-4bb31697de58"/>
<textFieldExpression><![CDATA[$F{val}]]></textFieldExpression>
</textField>
</jr:listContents>
</jr:list>
</componentElement>
</band>
</detail>
</jasperReport>
结果如下:
报告有什么问题?
您的字段可以稍微更新一下:
java.lang.String
java.util.List
- 这使得可以使用该字段作为子组件的数据源。然后传入Datasource的时候,传入list即可:
new JRBeanCollectionDatasource($F{strings})
new JRBeanArrayDatasource($F{strings})
对于您列出数据集,我只想:
java.lang.String
- 我不确定 val
是否有效,但我确信 _THIS
有效(5.2 和 6.3)如果您需要的话,我会尝试发布 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="sample" pageWidth="595" pageHeight="100" columnWidth="555" leftMargin="20" rightMargin="20" topMargin="20" bottomMargin="20" isIgnorePagination="true" uuid="6c570f43-054a-44a9-a9b1-ba4cf2cdcf86">
<subDataset name="ListDataSet" uuid="fb812d2a-cb63-473c-b7d3-149977476dd0">
<queryString language="JSON">
<![CDATA[strings]]>
</queryString>
<field name="val" class="java.lang.String">
<property name="net.sf.jasperreports.json.field.expression" value="."/>
<fieldDescription><![CDATA[.]]></fieldDescription>
</field>
</subDataset>
<queryString language="jsonql">
<![CDATA[]]>
</queryString>
<field name="header" class="java.lang.String">
<property name="net.sf.jasperreports.jsonql.field.expression" value="header"/>
<fieldDescription><![CDATA[header]]></fieldDescription>
</field>
<field name="strings" class="java.lang.String">
<property name="net.sf.jasperreports.jsonql.field.expression" value="strings"/>
<fieldDescription><![CDATA[strings]]></fieldDescription>
</field>
<background>
<band splitType="Stretch"/>
</background>
<pageHeader>
<band height="30" splitType="Stretch">
<textField>
<reportElement x="0" y="0" width="100" height="30" uuid="d98a55eb-ebbd-4cdd-8fa2-ae052b124aaa"/>
<textFieldExpression><![CDATA[$F{header}]]></textFieldExpression>
</textField>
</band>
</pageHeader>
<detail>
<band height="30" splitType="Stretch">
<componentElement>
<reportElement x="0" y="0" width="450" height="30" uuid="887dc258-2eac-4492-ae69-f9b2ffd1faee">
<property name="com.jaspersoft.studio.unit.CONTENTS.width" value="px"/>
</reportElement>
<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="Horizontal">
<datasetRun subDataset="ListDataSet" uuid="0904f194-ec62-41b4-96ab-8fe46a40166c">
<dataSourceExpression><![CDATA[((net.sf.jasperreports.engine.data.JsonDataSource)($P{REPORT_DATA_SOURCE})).subDataSource("strings")]]></dataSourceExpression>
</datasetRun>
<jr:listContents height="30" width="100">
<textField>
<reportElement x="0" y="0" width="90" height="30" uuid="4ee2d6b3-c681-433f-a170-4bb31697de58"/>
<textFieldExpression><![CDATA[$F{val}]]></textFieldExpression>
</textField>
</jr:listContents>
</jr:list>
</componentElement>
</band>
</detail>
</jasperReport>