如何在jasperreports中迭代JSON数组以创建重复报告

如何在jasperreports中迭代JSON数组以创建重复报告,json,jasper-reports,Json,Jasper Reports,我有一个JSON数据,其结构如下 [{ "a1":"b1", "a2":"b2", "details1":[{"a1":"b1"}], "details2":[{"a2":"b2"}], }, { "a1":"b1", "a2":"b2", "details1":[{"a1":"b1"}], "details2":[{"a2":"b2"}], }, { "a1":"b1", "a2":"b2", "details1":[{"a1":"b1"}], "details2":[{"a2":"b2"}]

我有一个JSON数据,其结构如下

[{
"a1":"b1",
"a2":"b2",
"details1":[{"a1":"b1"}],
"details2":[{"a2":"b2"}],
},
{
"a1":"b1",
"a2":"b2",
"details1":[{"a1":"b1"}],
"details2":[{"a2":"b2"}],
},
{
"a1":"b1",
"a2":"b2",
"details1":[{"a1":"b1"}],
"details2":[{"a2":"b2"}],
}]
我已经为details1和details2数组创建了单独的报告。 此外,我还为主表的一个元素创建了一个报告,将details1和details2报告作为子报告引用

问题是主报告只打印第一个元素的a1和a2,然后打印所有元素的所有details1和details2表中的所有元素

我的目标是创建一个报告,从主表的第一个元素打印a1、a2、details1、details2,然后打印第二个元素,依此类推。我怎样才能做到


换句话说,如何在JSON数组上迭代相同的报表模板?

您不必创建子报表就可以访问嵌套数组。一个更简单的解决方案是使用
子数据集
s

在您的情况下,需要为JSON源中的每个详细信息键创建子数据集:

<subDataset name="details1" uuid="4563e834-a9e5-43b5-9f0a-824948c73c73">
  <field name="A1" class="java.lang.String">
    <fieldDescription><![CDATA[a1]]></fieldDescription>
  </field>
</subDataset>
<subDataset name="details2" uuid="f703cb76-2a4a-44f1-9a42-227e180038d2">
  <field name="A2" class="java.lang.String">
    <fieldDescription><![CDATA[a2]]></fieldDescription>
  </field>
</subDataset>
<queryString language="json">
  <![CDATA[]]>
</queryString>

为了迭代主JSON源中的每个对象,主查询必须为空:

<subDataset name="details1" uuid="4563e834-a9e5-43b5-9f0a-824948c73c73">
  <field name="A1" class="java.lang.String">
    <fieldDescription><![CDATA[a1]]></fieldDescription>
  </field>
</subDataset>
<subDataset name="details2" uuid="f703cb76-2a4a-44f1-9a42-227e180038d2">
  <field name="A2" class="java.lang.String">
    <fieldDescription><![CDATA[a2]]></fieldDescription>
  </field>
</subDataset>
<queryString language="json">
  <![CDATA[]]>
</queryString>

然后,您需要使用知道如何处理子数据集(如表或列表)的结构。我在这里选择了一个列表,因为它更容易使用。对于第一个子数据集,您将拥有:

<componentElement>
  <reportElement x="90" y="40" width="333" height="20" uuid="c3237c70-6b2e-43e3-aa21-5092d8b91afc"/>
  <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="details1" uuid="f5fdc6a3-736f-43ce-b549-cd7332d19eb8">
      <dataSourceExpression><![CDATA[((net.sf.jasperreports.engine.data.JsonDataSource)$P{REPORT_DATA_SOURCE}).subDataSource("details1")]]></dataSourceExpression>
    </datasetRun>
    <jr:listContents height="20" width="333">
      <textField>
        <reportElement x="10" y="0" width="130" height="20" uuid="07e3ff2a-3832-4b06-9275-cb1ee8e51cfe"/>
        <textFieldExpression><![CDATA[$F{A1}]]></textFieldExpression>
      </textField>
    </jr:listContents>
  </jr:list>
</componentElement>

对于第二个子数据集,列表组件是相同的

下面是一个包含完整解决方案的简单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="Report" pageWidth="595" pageHeight="842" columnWidth="555" leftMargin="20" rightMargin="20" topMargin="20" bottomMargin="20" uuid="81afe112-ee1b-4443-8d1c-cb6d9ab95dd8">
  <property name="com.jaspersoft.studio.data.defaultdataadapter" value="JsonArrayDataAdapter.xml"/>
  <subDataset name="details1" uuid="4563e834-a9e5-43b5-9f0a-824948c73c73">
    <field name="A1" class="java.lang.String">
      <fieldDescription><![CDATA[a1]]></fieldDescription>
    </field>
  </subDataset>
  <subDataset name="details2" uuid="f703cb76-2a4a-44f1-9a42-227e180038d2">
    <field name="A2" class="java.lang.String">
      <fieldDescription><![CDATA[a2]]></fieldDescription>
    </field>
  </subDataset>
  <queryString language="json">
    <![CDATA[]]>
  </queryString>
  <field name="A1" class="java.lang.String">
    <fieldDescription><![CDATA[a1]]></fieldDescription>
  </field>
  <field name="A2" class="java.lang.String">
    <fieldDescription><![CDATA[a2]]></fieldDescription>
  </field>
  <detail>
    <band height="99" splitType="Stretch">
      <textField>
        <reportElement x="72" y="16" width="100" height="24" uuid="698866c8-7d26-4bc7-8727-b4a56d239a53"/>
        <textFieldExpression><![CDATA[$F{A1}]]></textFieldExpression>
      </textField>
      <textField>
        <reportElement x="190" y="16" width="100" height="24" uuid="e775c6c0-4058-4bc4-8c7a-d4d381fd6e66"/>
        <textFieldExpression><![CDATA[$F{A2}]]></textFieldExpression>
      </textField>
      <componentElement>
        <reportElement x="90" y="40" width="333" height="20" uuid="c3237c70-6b2e-43e3-aa21-5092d8b91afc"/>
        <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="details1" uuid="f5fdc6a3-736f-43ce-b549-cd7332d19eb8">
            <dataSourceExpression><![CDATA[((net.sf.jasperreports.engine.data.JsonDataSource)$P{REPORT_DATA_SOURCE}).subDataSource("details1")]]></dataSourceExpression>
          </datasetRun>
          <jr:listContents height="20" width="333">
            <textField>
              <reportElement x="10" y="0" width="130" height="20" uuid="07e3ff2a-3832-4b06-9275-cb1ee8e51cfe"/>
              <textFieldExpression><![CDATA[$F{A1}]]></textFieldExpression>
            </textField>
          </jr:listContents>
        </jr:list>
      </componentElement>
      <componentElement>
        <reportElement x="90" y="60" width="333" height="20" uuid="38f3ac11-ad3e-464c-813a-46132f23783f"/>
        <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="details2" uuid="833a13c3-e9b8-4f56-9f8f-279d32d403e8">
            <dataSourceExpression><![CDATA[((net.sf.jasperreports.engine.data.JsonDataSource)$P{REPORT_DATA_SOURCE}).subDataSource("details2")]]></dataSourceExpression>
          </datasetRun>
          <jr:listContents height="20" width="333">
            <textField>
              <reportElement x="10" y="0" width="130" height="20" uuid="3d9fb513-bfc9-4d95-a3da-16b95cf15e7c"/>
              <textFieldExpression><![CDATA[$F{A2}]]></textFieldExpression>
            </textField>
          </jr:listContents>
        </jr:list>
      </componentElement>
    </band>
  </detail>
</jasperReport>


您能举例说明您希望得到的结果吗?这样我们就可以确切地了解您的问题所在,通常您可以使用subDataSource创建一个新的数据源,请参见和Hi-Peter。谢谢你的建议。通过将报表中的所有内容(静态、动态字段和两个子报表)放入自定义组,我成功地解决了问题。我不确定是应该发布答案还是删除我的问题?我认为你应该改进你的问题和帖子答案(特别是因为其他用户已经发布了答案),尽量让它对未来的用户有用,因此,任何人都可以回答这个问题,而不需要发表意见,并且回答得很好。如果你没有足够的能量,那么也许我们可以将其作为副本关闭(我个人不喜欢删除其他用户投入能量来回答的内容)。我尝试使用上面的示例,但它会在页面上打印空值