将json数据源与JasperReports 4.5.1一起使用。获取JRExpressionEvalException异常

时间:2018-04-16 22:01:07

标签: json jasper-reports

我在从JSON数据源访问数组时遇到问题。我使用 jasperreports 4.5.1

我的contact.json文件:

{ "Person": { "FirstName": "John", "LastName": "Smith", "Contacts": [ { "Type":
"Cell", "Number": "555-555-5555" }, { "Type": "Home", "Number": "666-666-6666" }
] }
}

我的contact.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(&#34; Person.Contacts&#34)。

2 个答案:

答案 0 :(得分:0)

在JasperReports 4.5.1中,JsonDataSource没有subDataSource()方法。它是在JasperReports 5.0.4中引入的。

答案 1 :(得分:0)

正如@Narcis所提到的,JsonDataSource的subDataSource()方法是在JasperReports 5.0.4中引入的。并且有了这个事实,你不能在 jasperreports 4.5.1中使用它。 然后你应该尝试创建主报告和子报告。添加字段FirstName&amp;在主报表的详细信息区域中LastName并创建子报表以迭代Contacts数据。在主报表的详细信息区域中添加此子报表,选择子报表属性:“使用数据源表达式”并为数据源表达式设置以下值:

new net.sf.jasperreports.engine.data.JsonDataSource(new ByteArrayInputStream($F{Contacts}.toString().getBytes()),"")  

在子报告中,添加Type&amp; Number字段,它将相应地打印嵌套数组,用于主数组的每个节点。