我在从 JSON 数据源访问数组时遇到问题。我正在使用碧玉报告4.5.1。
我的联系人.json 文件:
{ "Person": { "FirstName": "John", "LastName": "Smith", "Contacts": [ { "Type":
"Cell", "Number": "555-555-5555" }, { "Type": "Home", "Number": "666-666-6666" }
] }
}
我的联系人.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="contact" language="groovy" pageWidth="595" pageHeight="842" columnWidth="555" leftMargin="20" rightMargin="20" topMargin="20" bottomMargin="20">
<property name="ireport.zoom" value="2.0"/>
<property name="ireport.x" value="0"/>
<property name="ireport.y" value="0"/>
<subDataset name="Contactdataset">
<queryString language="json">
<![CDATA[]]>
</queryString>
<field name="Type" class="java.lang.String">
<property name="net.sf.jasperreports.json.field.expression" value="Type"/>
</field>
<field name="Number" class="java.lang.String">
<property name="net.sf.jasperreports.json.field.expression" value="Number"/>
</field>
</subDataset>
<queryString language="json">
<![CDATA[]]>
</queryString>
<field name="FirstName" class="java.lang.String">
<property name="net.sf.jasperreports.json.field.expression" value="Person.FirstName"/>
</field>
<field name="LastName" class="java.lang.String">
<property name="net.sf.jasperreports.json.field.expression" value="Person.LastName"/>
</field>
<detail>
<band height="300" splitType="Stretch">
<staticText>
<reportElement x="0" y="0" width="80" height="30"/>
<textElement/>
<text><![CDATA[First Name:]]></text>
</staticText>
<staticText>
<reportElement x="0" y="30" width="80" height="30"/>
<textElement/>
<text><![CDATA[Last Name:]]></text>
</staticText>
<textField>
<reportElement x="80" y="0" width="200" height="30"/>
<textElement/>
<textFieldExpression><![CDATA[$F{FirstName}]]></textFieldExpression>
</textField>
<textField>
<reportElement x="80" y="30" width="200" height="30"/>
<textElement/>
<textFieldExpression><![CDATA[$F{LastName}]]></textFieldExpression>
</textField>
<componentElement>
<reportElement x="130" y="166" width="150" height="23"/>
<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="Contactdataset">
<dataSourceExpression><![CDATA[((net.sf.jasperreports.engine.data.JsonDataSource)$P{REPORT_DATA_SOURCE}).subDataSource("Person.Contacts")]]></dataSourceExpression>
</datasetRun>
<jr:listContents height="23" width="150">
<textField>
<reportElement x="27" y="0" width="100" height="17"/>
<textElement/>
<textFieldExpression><![CDATA[$F{Type}]]></textFieldExpression>
</textField>
</jr:listContents>
</jr:list>
</componentElement>
<staticText>
<reportElement x="157" y="150" width="100" height="16"/>
<textElement/>
<text><![CDATA[Type]]></text>
</staticText>
</band>
</detail>
我还尝试将Contactdataset
传递为:
<queryString language="json">
<![CDATA[Person.Contacts]]>
</queryString>
并在datasourceexpression
中传递了它,例如:
<dataSourceExpression><![CDATA[((net.sf.jasperreports.engine.data.JsonDataSource)$P{REPORT_DATA_SOURCE}).subDataSource("Contactdataset")]]></dataSourceExpression>
我做错了什么?我收到以下错误:
net.sf.jasperreports.engine.fill.JRExpressionEvalException: 错误计算表达式: 源文本 : ((net.sf.jasperreports.engine.data.JsonDataSource($P{REPORT_DATA_SOURCE}(.subDataSource("Person.Contacts"(
在 JasperReports 4.5.1 中,JsonDataSource
没有subDataSource()
方法。它是在JasperReports 5.0.4中引入的。
正如@Narcis所提到的,JsonDataSource的subDataSource()
方法是在JasperReports 5.0.4中引入的。 有了这个事实,你不能在JasperReports 4.5.1中使用它。然后,您应该尝试创建主报表和子报表。在主报表的详细信息带中添加字段 FirstName
& LastName
,并创建一个子报表以循环访问Contacts
数据。将此子报表添加到主报表的详细信息带上,选择子报表主体:"使用数据源表达式",并为数据源表达式设置以下值:
new net.sf.jasperreports.engine.data.JsonDataSource(new ByteArrayInputStream($F{Contacts}.toString().getBytes()),"")
在子报表中,添加Type
和Number
字段,它将为主数组的每个节点相应地打印嵌套数组。