首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何将JSON字段指定为基本图表?

如何将JSON字段指定为基本图表?
EN

Stack Overflow用户
提问于 2014-08-06 16:54:38
回答 1查看 1.2K关注 0票数 1

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

代码语言:javascript
运行
复制
{ "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}设置为值,但由于无法找到名或值的字段,因此会出现编译错误。

我还尝试过设置键表达式,类似于我对子报表所做的操作,如下所示:

代码语言:javascript
运行
复制
((net.sf.jasperreports.engine.data.JsonDataSource)$P{REPORT_DATA_SOURCE}).subDataSource("chartData")

但还是没有骰子。如果您有任何建议,请告诉我如何使用JSON数组和JasperReports的图表,或者如果需要的话,我需要如何重新格式化JSON。

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

==更新2-仍然没有运气==谢谢您的答复。我还是不能让这件事起作用。我稍微修改了您的代码,因为您使用reportingData作为包含subDataset的字段的名称,但这是报表顶层的名称。子数据应该使用chartData字段。

下面是我在报告中使用的内容。它显示了subDataset行旁边的eclipse插件中的一个红色错误指示器。

代码语言:javascript
运行
复制
        <?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>

如果你有什么建议,请告诉我。

EN

回答 1

Stack Overflow用户

发布于 2014-08-14 14:49:33

这就是我要尝试的(如果不起作用的话,让我知道,如果可能的话,我会编辑我的答案)。在开始定义字段之前,将subDataset插入到.jrxml中,就在标签开始后和标记aka之前。基于您在上面发布的JSON,我将尝试像这样定义数据集:

代码语言:javascript
运行
复制
<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之后,还需要定义指向它的字段,并将其与其他字段(可能已经有)放在一起。只要下面的字段存在,这些字段的顺序就无关紧要了:

代码语言:javascript
运行
复制
<field name="reporting_data" class="java.lang.String">
    <fieldDescription><![CDATA[reporting_data]]></fieldDescription>
</field>

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

代码语言:javascript
运行
复制
((net.sf.jasperreports.engine.data.JsonDataSource)$P{REPORT_DATA_SOURCE}).subDataSource("reporting_data")

至于要使用的类,我建议尽可能保持java.lang.String。我在使用其他人时遇到了麻烦,如果您使用的是其他东西而不是java.lang.String,那么您可以根据将数据传递给java.lang.String的方式获得错误。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25165942

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档