Jasper Json 嵌套列表

Jasper Json nested lists

我是 Jasper 报告的新手,所以如果允许的话,我会写下我的整个任务..

我正在尝试解析 json 数据以在其中打印 PDF。数据来自 Oracle DB,写在 CLOB 列中,所以我有 json-clob 条记录的列表。

我有嵌套列表 json(和 clob)数据,所以我无法用我的 jasper 经验构建 3 个阶梯嵌套报告。我有这样的 json 结构:

{
  title: 'Main Title',
  blocks: [{
    title: 'Inner Title',
    items: [{
      key: '1',
      value: 'some text'
    }, {
      key: '2',
      value: 'some other text'
    }]
  }, {
    text: 'here may be other fields (text, not title)'
  }]
}

对于这个 json 数据,我想得到这个 PDF 格式的结果(只是简单的输出):

Main Title
Inner Title
1 some text
2 some other text
here may be other fields (text, not title)

首先,我在 json source ( script:

中使用 CLOB 转换
< dataSourceExpression >
  < ![CDATA[new net.sf.jasperreports.engine.data.JsonQLDataSource(new ByteArrayInputStream($F{JSON_CLOB_RECORD}.getBytes("UTF-8")))]] >
< /dataSourceExpression >

来源:nested jasper subreports with json datasource).

之后,我使用jr:list 和文本字段来打印主要标题。我已经完成了,不知道如何继续。

我搜索了嵌套列表 (jr:list),但一无所获,不适合我的任务。

P.S。我有用于将数据从 CLOB 解析为 json 的子数据集,其中包含字段标题 (java.lang.String) 和块(我在这里尝试了 java.util.Collection 和 ArrayList,但发生了错误,比我写的 java.lang.Object。是否有必要在此子数据集中写入块字段?)。我还为块列表添加了子数据集,是否需要?如果是,那么我也必须添加项目子数据集,对吗?此外,我尝试在主标题文本字段之后添加子报表,用于块列表并添加 dataSourceExpression 但无法继续。

需要一些帮助。

我建议使用子报表,而不是列表或嵌套列表,因为在这种情况下您可以获得更大的灵活性。

在主报表中,您应该丢弃列表元素和数据集并使用子报表,例如:

<subreport>
    <reportElement x="0" y="0" width="550" height="50" uuid="37861aca-d444-4aec-ad03-baa310540327"/>
    <subreportParameter name="JSON_INPUT_STREAM">
        <subreportParameterExpression><![CDATA[new ByteArrayInputStream($F{JSON_CLOB_RECORD}.getBytes("UTF-8"))]]></subreportParameterExpression>
    </subreportParameter>
    <subreportExpression><![CDATA["Subreport.jasper"]]></subreportExpression>
</subreport>

这里我们只需要 JSON_INPUT_STREAM 这样子报表就会根据查询和它的语言构造一个数据源。

案例 1。如果您对 items 键最感兴趣,那么子报表 (Subreport.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="Subreport" pageWidth="595" pageHeight="842" columnWidth="555" leftMargin="20" rightMargin="20" topMargin="20" bottomMargin="20" uuid="a3dd10f8-b28c-4c11-b582-9b169e8aa417">
    <queryString language="jsonql">
        <![CDATA[..items.*]]>
    </queryString>
    <field name="mainTitle" class="java.lang.String">
        <property name="net.sf.jasperreports.jsonql.field.expression" value="$.title"/>
    </field>
    <field name="key" class="java.lang.String">
        <property name="net.sf.jasperreports.jsonql.field.expression" value="key"/>
    </field>
    <field name="value" class="java.lang.String">
        <property name="net.sf.jasperreports.jsonql.field.expression" value="value"/>
    </field>
    <field name="blockTitle" class="java.lang.String">
        <property name="net.sf.jasperreports.jsonql.field.expression" value="^^.title"/>
    </field>
    <background>
        <band splitType="Stretch"/>
    </background>
    <detail>
        <band height="90" splitType="Stretch">
            <textField>
                <reportElement isPrintRepeatedValues="false" x="0" y="30" width="100" height="30" isRemoveLineWhenBlank="true" uuid="172de051-3d2c-4458-b01e-ab06e4e1bb3b"/>
                <textFieldExpression><![CDATA[$F{blockTitle}]]></textFieldExpression>
            </textField>
            <textField>
                <reportElement isPrintRepeatedValues="false" x="0" y="0" width="100" height="30" isRemoveLineWhenBlank="true" uuid="94f57756-a5a8-402f-ad23-7cdbe2a00e59"/>
                <textFieldExpression><![CDATA[$F{mainTitle}]]></textFieldExpression>
            </textField>
            <textField>
                <reportElement x="0" y="60" width="100" height="30" uuid="7dbbdfd8-5a0e-4288-ae39-21f13cd4d921"/>
                <textFieldExpression><![CDATA[$F{key} + " " + $F{value}]]></textFieldExpression>
            </textField>
        </band>
    </detail>
</jasperReport>

请注意删除重复项和行的 isPrintRepeatedValues="false"isRemoveLineWhenBlank="true" 属性,以便获得所需的输出。

我用序列化的 JSON 模拟了您的案例,得到以下结果:

案例 2。如果您对所有 blocks 对象数据感兴趣,则必须在查询中找到 blocks 项并为 [= 创建一个 list/subreport 14=] 键,类似于:

<?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="Report" pageWidth="595" pageHeight="842" columnWidth="555" leftMargin="20" rightMargin="20" topMargin="20" bottomMargin="20" uuid="a3dd10f8-b28c-4c11-b582-9b169e8aa417">
    <subDataset name="BlockItemsDataset" uuid="83c1b8ed-e880-4474-a809-39d95277341f">
        <field name="key" class="java.lang.String">
            <property name="net.sf.jasperreports.jsonql.field.expression" value="key"/>
        </field>
        <field name="value" class="java.lang.String">
            <property name="net.sf.jasperreports.jsonql.field.expression" value="value"/>
        </field>
    </subDataset>
    <queryString language="jsonql">
        <![CDATA[blocks]]>
    </queryString>
    <field name="mainTitle" class="java.lang.String">
        <property name="net.sf.jasperreports.jsonql.field.expression" value="$.title"/>
    </field>
    <field name="blockTitle" class="java.lang.String">
        <property name="net.sf.jasperreports.jsonql.field.expression" value="title"/>
    </field>
    <background>
        <band splitType="Stretch"/>
    </background>
    <detail>
        <band height="91" splitType="Stretch">
            <textField>
                <reportElement isPrintRepeatedValues="false" x="0" y="0" width="100" height="30" isRemoveLineWhenBlank="true" uuid="94f57756-a5a8-402f-ad23-7cdbe2a00e59"/>
                <textFieldExpression><![CDATA[$F{mainTitle}]]></textFieldExpression>
            </textField>
            <textField>
                <reportElement isPrintRepeatedValues="false" x="0" y="30" width="100" height="30" isRemoveLineWhenBlank="true" uuid="172de051-3d2c-4458-b01e-ab06e4e1bb3b"/>
                <textFieldExpression><![CDATA[$F{blockTitle}]]></textFieldExpression>
            </textField>
            <componentElement>
                <reportElement x="0" y="61" width="200" height="30" uuid="7a94d84d-d58e-4508-b143-3704fa7f5cd3"/>
                <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="BlockItemsDataset" uuid="a866f955-7594-4fb9-9bb2-936282963dea">
                        <dataSourceExpression><![CDATA[((net.sf.jasperreports.engine.data.JsonQLDataSource)$P{REPORT_DATA_SOURCE}).subDataSource("items")]]></dataSourceExpression>
                    </datasetRun>
                    <jr:listContents height="30" width="200">
                        <textField>
                            <reportElement x="0" y="0" width="200" height="30" uuid="36a771fa-f949-4c69-a62c-1df0c610a2d3"/>
                            <textFieldExpression><![CDATA[$F{key} + " " + $F{value}]]></textFieldExpression>
                        </textField>
                    </jr:listContents>
                </jr:list>
            </componentElement>
        </band>
    </detail>
</jasperReport>