【问题标题】:how to specify JSON field to base chart on?如何指定 JSON 字段作为图表的基础?
【发布时间】:2014-08-22 10:12:03
【问题描述】:

我有一个基于 JSON 数据的 JasperReports 报告。我正在尝试添加一个图表来显示“chartData”数组的值,但没有任何运气。这是 JSON 的样子。

{ "reportingData": {  "dateRange": "January 1, 2014-January 31, 2014", "name" : "Name Goes Here"  , "chartData" : [ { "name" : "Industry 1", "value" : "10" } , { "name" : "Industry 2", "value" : "20" } , { "name" : "Industry 3", "value" : "30" } , { "name" : "Industry 4", "value" : "40" } , { "name" : "Industry 5", "value" : "50" }], "pageNumber": 1, "nextPage" : "true"} }

当我将图表添加到报告中时,我尝试将$F{chartData} 设置为键表达式,然后将$F{name} 作为标签,$F{value} 作为值,但是我得到了编译错误,因为它不能找到名为 name 或 value 的字段。

我也尝试过设置与子报表类似的键表达式,如下所示:

((net.sf.jasperreports.engine.data.JsonDataSource)$P{REPORT_DATA_SOURCE}).subDataSource("chartData")

但仍然没有骰子。如果您有任何建议,请告诉我如何将 JSON 数组与 JasperReports 的图表一起使用 - 或者如果需要,我需要如何重新格式化我的 JSON。

== 更新 - 仍然需要帮助! == 我不确定 subDataSet 元素应该去哪里。另外,我猜想在 subDataset 中我想使用 chartData 属性而不是日期范围,因为这是图表的数据,但我应该使用什么类 - 仍然是 java.lang.String?您建议的另一种方法几乎就是我尝试的方法(请参阅原始问题),除了使用 chartData 属性而不是 reportData 属性,后者是整个报告的数据集。如果您有任何建议,或者是否有人可以为使用子数据集的工作图表发布 XML,请告诉我。

== 更新 2 - 仍然没有运气 == 感谢您的答复。我仍然无法让它工作。我稍微修改了您的代码,因为您使用reportingData 作为包含子数据集的字段的名称,但这是报告顶层的名称。子数据应使用 chartData 字段。

这是我现在在报告中使用的内容。它在关于子数据集的行旁边的 eclipse 插件中显示一个红色的错误指示器。

        <?xml version="1.0" encoding="UTF-8"?>
        <!-- Created with Jaspersoft Studio version last-->
        <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="Blank_A4" pageWidth="595" pageHeight="842" columnWidth="555" leftMargin="20" rightMargin="20" topMargin="20" bottomMargin="20" uuid="90544f77-b050-4811-8365-51bb292ac717">
            <property name="com.jaspersoft.studio.data.defaultdataadapter" value="TEST_FOR_CHART"/>
            <queryString language="json">
                <![CDATA[reportingData]]>
            </queryString>
            <subDataset name="chartData" uuid="2a00961e-0d9c-4bd2-b124-c4cad2fc24c9">
                <parameter name="default_null_text" class="java.lang.String"/>
                <field name="name" class="java.lang.String">
                    <fieldDescription><![CDATA[name]]></fieldDescription>
                </field>
                <field name="value" class="java.lang.String">
                    <fieldDescription><![CDATA[value]]></fieldDescription>
                </field>
            </subDataset>
            <field name="dateRange" class="java.lang.String">
                <fieldDescription><![CDATA[dateRange]]></fieldDescription>
            </field>
            <field name="name" class="java.lang.String">
                <fieldDescription><![CDATA[name]]></fieldDescription>
            </field>
            <field name="chartData" class="java.lang.String">
                <fieldDescription><![CDATA[chartData]]></fieldDescription>
            </field>
            <field name="pageNumber" class="java.lang.String">
                <fieldDescription><![CDATA[pageNumber]]></fieldDescription>
            </field>
            <field name="nextPage" class="java.lang.String">
                <fieldDescription><![CDATA[nextPage]]></fieldDescription>
            </field>
            <background>
                <band splitType="Stretch"/>
            </background>
            <title>
                <band height="79" splitType="Stretch"/>
            </title>
            <pageHeader>
                <band height="35" splitType="Stretch"/>
            </pageHeader>
            <columnHeader>
                <band height="61" splitType="Stretch"/>
            </columnHeader>
            <detail>
                <band height="252" splitType="Stretch">
                    <pieChart>
                        <chart evaluationTime="Report">
                            <reportElement x="200" y="10" width="200" height="200" uuid="d5b01ba1-6dea-4465-b440-78b4ebf2af8d"/>
                            <chartTitle/>
                            <chartSubtitle/>
                            <chartLegend/>
                        </chart>
                        <pieDataset>
                            <keyExpression><![CDATA[((net.sf.jasperreports.engine.data.JsonDataSource)$P{REPORT_DATA_SOURCE}).subDataSource("chartData")]]></keyExpression>
                            <valueExpression><![CDATA[0]]></valueExpression>
                        </pieDataset>
                        <piePlot>
                            <plot/>
                            <itemLabel/>
                        </piePlot>
                    </pieChart>
                </band>
            </detail>
            <columnFooter>
                <band height="45" splitType="Stretch"/>
            </columnFooter>
            <pageFooter>
                <band height="54" splitType="Stretch"/>
            </pageFooter>
            <summary>
                <band height="42" splitType="Stretch"/>
            </summary>
        </jasperReport>

如果您有任何建议,请告诉我。

【问题讨论】:

  • 几个问题/建议: 1. 你能发布你得到的错误吗? 2. 您的键表达式看起来不错,但是您是否有指向指定字段名称和值的数据源? (如果您需要,我可以发布这应该是什么样子) 3. 然后我发现在我有一个数据集后我需要一个字段来指向它,因此您的 chartData 将是您定义的字段,而 chartDataDataSet 将是您的数据集。 4. 您已经正确地将 json 数据添加到您的 jasper 报告中了吗?如果不是,您最初如何将其传递给报告?
  • 感谢您的回复,亚历克斯。当我将图表添加到报表时,出现的向导只允许我选择 [Main Dataset] 作为数据集。如果图表的工作方式类似于子报表,我猜我希望“chartData”字段成为数据源,但我不知道如何正确地做到这一点。
  • 这是导致编译错误的当前数据集:
  • 我正在正确地将数据输入到主报告中。这是这样做的:
  • 很抱歉叫你亚历克斯,奥威尔!我看到我的帖子是由 Alex 编辑的,并认为这就是回复的来源。如果您有任何建议,请告诉我。

标签: json charts jasper-reports


【解决方案1】:

这是我会尝试的(如果它不起作用,请告诉我,如果可能,我会编辑我的答案)。 将您的 subDataset 插入 .jrxml 中,紧接在开头的标记之后和标记之前,也就是在您开始定义字段之前。根据您在上面发布的 JSON,我将尝试像这样定义数据集:

<subDataset name="reportingData" uuid="2a00961e-0d9c-4bd2-b124-c4cad2fc24c9">
    <parameter name="default_null_text" class="java.lang.String"/>
    <field name="dateRange" class="java.lang.String">
        <fieldDescription><![CDATA[dateRange]]></fieldDescription>
    </field>
    <field name="name" class="java.lang.String">
        <fieldDescription><![CDATA[name]]></fieldDescription>
    </field>
    <field name="chartData" class="java.lang.String">
        <fieldDescription><![CDATA[chartData]]></fieldDescription>
    </field>
    <field name="pageNumber" class="java.lang.String">
        <fieldDescription><![CDATA[pageNumber]]></fieldDescription>
    </field>
    <field name="nextPage" class="java.lang.String">
        <fieldDescription><![CDATA[nextPage]]></fieldDescription>
    </field>
</subDataset>

在定义您的 subDataset 之后,您还需要定义一个指向它的字段,您可以将其与其他字段(您可能已经拥有)放在一起。只要下面的字段存在,这些字段的顺序无关紧要:

<field name="reporting_data" class="java.lang.String">
    <fieldDescription><![CDATA[reporting_data]]></fieldDescription>
</field>

然后,当您使用此数据集创建图表时,您将“使用 JRDatasource 表达式”。您要使用的表达式如下:

((net.sf.jasperreports.engine.data.JsonDataSource)$P{REPORT_DATA_SOURCE}).subDataSource("reporting_data")

至于要使用的类,我建议尽可能使用 java.lang.String。我在使用其他人时遇到了麻烦,如果您使用的是其他东西而不是 java.lang.String,那么如果您在那里有空数据,您可能会收到错误,具体取决于您将数据传递给 jasperPrint 的方式。

【讨论】:

  • 我尝试了您建议的轻微变化,但没有运气。请查看原始问题的更新。
猜你喜欢
  • 1970-01-01
  • 2023-03-28
  • 2020-09-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-26
  • 1970-01-01
  • 2020-05-07
相关资源
最近更新 更多