【问题标题】:How to get Jasper reports 6.5.1 to populate json table如何让 Jasper 报告 6.5.1 填充 json 表
【发布时间】:2018-02-22 18:34:05
【问题描述】:

这与之前的问题相似,但它让我很难过。我使用的是 Studio 6.5.1 CE 版本。所以我在一个开始的文件中有 json 数据

{
    "users": {
        "itemCount": 30,
        "items": [{
            "id": 1,
            "username": "user1",
...

我的主要 json 查询是空白的,定义了一个字段:itemCount,表达式为“users.itemCount”。

我有一个详细信息波段表和带有 jsonql 查询“users.items”的“UserDataset”。字段“id”表示“id”,“username”表示“username”等。数据预览准确显示字段。

运行报告时,我确实看到填充了单个 itemCount 字段。问题是桌子不见了。显然我无法成功地将数据源绑定到表。我尝试了各种表达方式,我认为这样的东西应该可以工作:

<datasetRun...>
    ...
    <dataSourceExpression><![CDATA[((net.sf.jasperreports.engine.data.JsonDataSource)$P{REPORT_CONNECTION}).subDataSource("users.items")]]></dataSourceExpression>
</datasetRun>

但是,我永远无法填充表格。我究竟做错了什么? (我有与 jdbc 源类似的报告格式,我对这些表没有任何问题。)

我找不到任何有效的查询/表达式组合,所以我附加了带有样式信息的 jrxml 文件以供查看。

<?xml version="1.0" encoding="UTF-8"?>
<!-- Created with Jaspersoft Studio version 6.5.1.final using JasperReports Library version 6.5.1  -->
<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="Users" pageWidth="792" pageHeight="612" orientation="Landscape" columnWidth="752" leftMargin="20" rightMargin="20" topMargin="20" bottomMargin="20" isIgnorePagination="true" uuid="61928541-d006-4374-9164-985c6c4116c9">
    <property name="com.jaspersoft.studio.data.defaultdataadapter" value="Users.json"/>
    <subDataset name="UserDataset" uuid="effd13cd-71de-4771-b706-d68b1042b564">
        <property name="com.jaspersoft.studio.data.defaultdataadapter" value="Users.json"/>
        <queryString language="jsonql">
            <![CDATA[users.items]]>
        </queryString>
        <field name="id" class="java.lang.Integer">
            <property name="net.sf.jasperreports.jsonql.field.expression" value="id"/>
            <fieldDescription><![CDATA[id]]></fieldDescription>
        </field>
        <field name="username" class="java.lang.String">
            <property name="net.sf.jasperreports.jsonql.field.expression" value="username"/>
            <fieldDescription><![CDATA[username]]></fieldDescription>
        </field>
    </subDataset>
    <queryString language="jsonql">
        <![CDATA[]]>
    </queryString>
    <field name="itemCount" class="java.lang.Integer">
        <property name="net.sf.jasperreports.jsonql.field.expression" value="users.itemCount"/>
        <fieldDescription><![CDATA[itemCount]]></fieldDescription>
    </field>
    <detail>
        <band height="116" splitType="Stretch">
            <componentElement>
                <reportElement x="-9" y="50" width="770" height="62" uuid="7d7f19b0-9800-43ab-86a4-45846dae7775">
                    <property name="com.jaspersoft.studio.layout" value="com.jaspersoft.studio.editor.layout.VerticalRowLayout"/>
                    <property name="com.jaspersoft.studio.table.style.table_header" value="Table_TH"/>
                    <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="UserDataset" uuid="fdfe69e2-eeac-4287-9e41-4c39610a79be">
                        <datasetParameter name="JSON_INPUT_STREAM">
                            <datasetParameterExpression><![CDATA[$P{JSON_INPUT_STREAM}]]></datasetParameterExpression>
                        </datasetParameter>
                        <datasetParameter name="net.sf.jasperreports.json.source">
                            <datasetParameterExpression><![CDATA[$P{net.sf.jasperreports.json.source}]]></datasetParameterExpression>
                        </datasetParameter>
                        <datasetParameter name="net.sf.jasperreports.json.sources">
                            <datasetParameterExpression><![CDATA[$P{net.sf.jasperreports.json.sources}]]></datasetParameterExpression>
                        </datasetParameter>
                        <datasetParameter name="net.sf.jasperreports.json.date.pattern">
                            <datasetParameterExpression><![CDATA[$P{net.sf.jasperreports.json.date.pattern}]]></datasetParameterExpression>
                        </datasetParameter>
                        <datasetParameter name="net.sf.jasperreports.json.number.pattern">
                            <datasetParameterExpression><![CDATA[$P{net.sf.jasperreports.json.number.pattern}]]></datasetParameterExpression>
                        </datasetParameter>
                        <datasetParameter name="JSON_LOCALE">
                            <datasetParameterExpression><![CDATA[$P{JSON_LOCALE}]]></datasetParameterExpression>
                        </datasetParameter>
                        <datasetParameter name="net.sf.jasperreports.json.locale.code">
                            <datasetParameterExpression><![CDATA[$P{net.sf.jasperreports.json.locale.code}]]></datasetParameterExpression>
                        </datasetParameter>
                        <datasetParameter name="JSON_TIME_ZONE">
                            <datasetParameterExpression><![CDATA[$P{JSON_TIME_ZONE}]]></datasetParameterExpression>
                        </datasetParameter>
                        <datasetParameter name="net.sf.jasperreports.json.timezone.id">
                            <datasetParameterExpression><![CDATA[$P{net.sf.jasperreports.json.timezone.id}]]></datasetParameterExpression>
                        </datasetParameter>
                        <dataSourceExpression><![CDATA[((net.sf.jasperreports.engine.data.JsonDataSource)$P{REPORT_CONNECTION}).subDataSource("users.items")]]></dataSourceExpression>
                    </datasetRun>
                    <jr:column width="30" uuid="65fed6e9-ae42-4e04-b0b4-e2c8ef4a1b27">
                        <property name="com.jaspersoft.studio.components.table.model.column.name" value="Column1"/>
                        <jr:columnHeader style="Table_CH" height="30" rowSpan="1">
                            <staticText>
                                <reportElement x="0" y="0" width="30" height="30" uuid="becae13f-4af9-4884-9b38-ab19347e9455"/>
                                <text><![CDATA[USER_ID]]></text>
                            </staticText>
                        </jr:columnHeader>
                        <jr:detailCell style="Table_TD" height="30">
                            <textField>
                                <reportElement x="0" y="0" width="30" height="30" uuid="8c6b26dc-c436-4e68-acd5-89c33e09dac6"/>
                                <textFieldExpression><![CDATA[$F{id}]]></textFieldExpression>
                            </textField>
                        </jr:detailCell>
                    </jr:column>
                    <jr:column width="90" uuid="224b44e6-a9c2-4407-891d-623c7d6b33dc">
                        <property name="com.jaspersoft.studio.components.table.model.column.name" value="Column2"/>
                        <jr:columnHeader style="Table_CH" height="30" rowSpan="1">
                            <staticText>
                                <reportElement x="0" y="0" width="90" height="30" uuid="3c961dd1-f991-4cde-9d22-224d4f3ae86c"/>
                                <text><![CDATA[USERNAME]]></text>
                            </staticText>
                        </jr:columnHeader>
                        <jr:detailCell style="Table_TD" height="30">
                            <textField>
                                <reportElement x="0" y="0" width="90" height="30" uuid="3acbeee1-e7a4-4f45-b54c-b10c69bf7a95"/>
                                <textFieldExpression><![CDATA[$F{username}]]></textFieldExpression>
                            </textField>
                        </jr:detailCell>
                    </jr:column>
                </jr:table>
            </componentElement>
            <textField>
                <reportElement x="0" y="10" width="100" height="30" uuid="683b48a8-3f4d-4a3a-9ab5-df8255699b8b"/>
                <textFieldExpression><![CDATA[$F{itemCount}]]></textFieldExpression>
            </textField>
        </band>
    </detail>
    <pageFooter>
        <band height="39" splitType="Stretch">
            <textField>
                <reportElement x="326" y="6" width="100" height="30" uuid="94b2cbaa-c1f0-4934-a304-a0c4c84486a0"/>
                <textFieldExpression><![CDATA["Page" +$V{PAGE_NUMBER}]]></textFieldExpression>
            </textField>
        </band>
    </pageFooter>
</jasperReport>

【问题讨论】:

  • 尝试将“UserDataset”保留为无/空查询。您的 subDatasource 表达式已经导航到那里。
  • 找不到任何有效的查询导航和表达式组合。

标签: json jasper-reports


【解决方案1】:

您的子数据集应该没有查询,如下所示:

<subDataset name="UserDataset" uuid="effd13cd-71de-4771-b706-d68b1042b564">
    <field name="id" class="java.lang.Integer">
        <property name="net.sf.jasperreports.jsonql.field.expression" value="id"/>
        <fieldDescription><![CDATA[id]]></fieldDescription>
    </field>
    <field name="username" class="java.lang.String">
        <property name="net.sf.jasperreports.jsonql.field.expression" value="username"/>
        <fieldDescription><![CDATA[username]]></fieldDescription>
    </field>
</subDataset>

并且您的表的 datasetRun 应该只使用正确的表达式,就像这样,其中没有其他内容(您将 REPORT_CONNECTION 转换为 JsonDataSource):

<datasetRun subDataset="UserDataset" uuid="fdfe69e2-eeac-4287-9e41-4c39610a79be">
    <dataSourceExpression><![CDATA[((net.sf.jasperreports.engine.data.JsonQLDataSource)$P{REPORT_DATA_SOURCE}).subDataSource("users.items")]]></dataSourceExpression>
</datasetRun>

【讨论】:

  • 是的!这就是答案。
  • 我还发现,真正的解决方法是使用正确的 dataSource 表达式以及“users.items”查询。 subDataset 可以具有相同的查询,以便从 json 数据源中读取和定义字段。这也提供了将字段定义为进一步进入 json 结构的相对查询的简单能力,因为我有一个带有表达式“userProfile.fullName”的“fullName”字段,其中绝对路径是 users.items.userProfile.fullName。跨度>
  • 我认为 subDataset 查询之所以起作用,只是因为 Studio 在那里注入了适配器。在 Studio 之外它不应该工作。
  • 我无法让服务器支持数据适配器。最后我将它添加到 jrxml 文件中: 其中 ds_JsonUsers 是从 Studio 上传的适配器。
  • 但是,REST_V2 接口调用以“一般错误”运行报告错误 - 并且没有任何文本。这与我定义适配器的方式有关吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多