如何从JasperReports中的另一个数据源(JSON)访问字段的值?

时间:2018-08-09 04:33:34

标签: json jasper-reports

我正在使用TIBCOJaspersoft®Studio 6.3.1 final。我正在尝试使用两个数据源(格式为JSON)创建报告。

JSON的结构类似于:

{    
    "first":
        {"parameter1" : 123},
    "second":[
        {"key" : 1},
        {"key" : 2}
    ]
}

所以我有两个数据源。一个用于 first 对象(firstSource),另一个(secondSource)用于 second 对象(对象数组)。

数组( second )打印在表组件中。我想从 first 对象(first.parameter1)访问字段并将其打印在表标题中。

表正在使用此数据集:

<datasetRun uuid="4ee63b06-f4ee-45b4-9da8-3dabc3e7a09d">
    <dataSourceExpression> <![CDATA[$P{secondSource})]]></dataSourceExpression>
</datasetRun>

然后,我使用$F{key}打印其字段。

您知道如何从表中访问 first 对象的 parameter1 吗?也许使用某种$ V {}变量或合并两个数据源?

我尝试使用subDataSource和subDataSet方法没有任何运气。

我想在结果表中实现以下目标:

result table

1 个答案:

答案 0 :(得分:1)

让我开始说,您所讨论的json结构不是动态处理预期输出的最佳结构,如果parameter1实际上位于第二个节点内会更好,请参见{{ 3}},以了解在这种情况下如何处理和访问节点。

无论如何

是的,您应该在Jasper报告中按数据源进行思考。在预期的输出中,基本上有2个数据源second是表,而first是标题。是的,首先只有1条记录,但是要访问它,您可以为其创建数据源,然后使用组件或子报表来显示它。

考虑到这一点,解决您的问题的一种方法是

  1. 为表创建一个数据集(字段为key),并将second节点作为数据源传递

  2. 为标题创建一个数据集(字段为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>

注释:

  1. DatasetMain中创建一个参数,以便这次可以在表中再次访问报表主数据源(整个json文件),并为{{1}创建新的subDataSource }

  2. 在标头中,我使用first组件显示第二个数据源(jr:list)的值,也可以使用简单的子报表提取此值。

输出(使用有问题的json)

How to create multiple tables in jasper report using json as a datasource?